【问题标题】:Django South - Migration not re-creating model after dropping table from sqlite3Django South - 从 sqlite3 删除表后迁移未重新创建模型
【发布时间】:2014-07-10 00:23:01
【问题描述】:

我是 Django 和 South 的新手和新用户。我在模型包中创建了一个新模型 (approval.py)(并将其链接到模型的 init.py 中),并且能够成功迁移我的应用程序以接受新模型。但是,当我尝试在管理站点上查找该模型时,由于未应用 Guardian 权限,我收到了 403 禁止错误。 于是我直接从 sqlite 命令提示符中删除了表,并尝试再次执行以下命令:

   $python manage.py syncdb 
   ...
   (use ./manage.py migrate to migrate these)

   $python manage.py schemamigration myapp --auto
   Nothing seems to have changed.

   $python manage.py migrate myapp
   Running migrations for myapp:
   - Nothing to migrate.
    - Loading initial data for myapp.
   Installed 0 object(s) from 0 fixture(s)

但是,当我签入 sqlite 命令提示符时,不再创建表。另外,我已经在我的 admin.sites.url 上注册了这个模型,但它不再显示它并给出错误:

DatabaseError at /admin/myapp/approval/
no such table: myapp_approval
Request Method: GET
Request URL:    http://localhost/admin/approval/
Django Version: 1.5.1
Exception Type: DatabaseError
Exception Value:    
no such table: myapp_approval
Exception Location: /home/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py in execute, line 362
Python Executable:  /home/bin/python2.7
Python Version: 2.7.5
Python Path:    
['.........']
Server time:    Wed, 9 Jul 2014 19:12:00 -0500

我已经检查了 StackOverflow 上发布的有关使用 South 进行迁移的所有其他问题,特别是有关“似乎没有任何变化”的错误。但是,我无法通过任何这些解决方案解决我的问题。

我请求一些帮助:

  • 从头开始重新创建审批模型并成功迁移
  • 或修复现有审批模型。

谢谢。

【问题讨论】:

    标签: python django django-models django-south


    【解决方案1】:

    经过大量的反复试验后,我终于找到了一些非常简单的方法。我在南迁中运气不佳。因此,当我从 sqlite3 手动删除表时,我决定在 sqlite3 中手动创建表,一切正常。 我在 sqlite3 提示符下使用了以下脚本,它解决了我的问题,我能够通过我的管理站点正确访问批准页面并对其执行所有 CRUD 操作。

    CREATE TABLE "myapp_approval" ("id" integer NOT NULL PRIMARY KEY, "desc" varchar(256) NOT NULL);
    

    感谢大家的帮助和支持!

    【讨论】:

    • FWIW 在重新创建表格时我不必详细说明。 CREATE TABLE "myapp_approval" ("id" integer NOT NULL PRIMARY KEY) 自己启动了表,然后运行 ​​migrate 为我完成了其余部分。
    【解决方案2】:

    您已经创建了一个创建新表的迁移,并且根据 South 的历史管理,您已经运行了此迁移。 South 不知道您的数据库的实际更改。

    您需要做的是在创建新表之前恢复到迁移。如果您查看您的应用程序文件夹,您会发现一个 migrations 文件夹,其中包含一些迁移文件。如果您在例如创建新表迁移0005,您需要(可选)向后迁移到0005,然后您需要伪造向后迁移到0004并再次迁移:

    manage.py migrate myapp 0005
    manage.py migrate myapp 0004 --fake
    manage.py migrate myapp
    

    【讨论】:

    • 嗨@knbk,不幸的是,向后迁移对我不起作用,因为它不再找到批准表(因为我已经从 sqlite3 手动删除了它)。我收到以下错误:
    • 为 myapp 运行迁移:- 向后迁移到 0002_auto__add_test 之后。
    猜你喜欢
    • 2011-11-04
    • 2021-01-21
    • 2012-12-28
    • 1970-01-01
    • 2012-05-19
    • 2014-12-30
    • 2013-07-27
    • 2015-06-08
    • 2011-08-14
    相关资源
    最近更新 更多