Django South - 从sqlite3删除表后迁移未重新创建模型
我刚开始学习Django和South,还是个新手。我在我的模型包里创建了一个新的模型(approval.py),并在模型的init.py里链接了它,成功地把我的应用迁移到可以接受这个新模型。不过,当我在管理网站上查找这个模型时,出现了403禁止访问的错误,因为没有应用Guardian权限。
于是我直接在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进行迁移的其他问题,特别是关于“似乎没有任何变化”的错误。不过,我尝试了那些解决方案,还是无法解决我的问题。
我希望能得到一些帮助,具体是:
- 从头开始重新创建approval模型,并成功迁移
- 或者修复现有的approval模型。
谢谢。
2 个回答
你已经创建了一个迁移,用来建立新的数据表,并且根据South的历史管理,你已经运行了这个迁移。可是,South并不知道你数据库里实际发生了什么变化。
你需要做的是,回到创建新表之前的那个迁移。如果你查看你的应用文件夹,会发现里面有一个 migrations
文件夹,里面有一些迁移文件。如果你是在迁移 0005
中创建的新表,那么你需要(可选地)先回退到 0005
,然后再伪装成回退到 0004
,最后再进行一次迁移:
manage.py migrate myapp 0005
manage.py migrate myapp 0004 --fake
manage.py migrate myapp
经过很多次尝试和错误,我终于找到了一种非常简单的方法。之前我在使用south迁移时运气不太好。于是我手动从sqlite3中删除了表格,接着决定在sqlite3中手动创建这个表格,结果一切都正常运作了。
我在sqlite3的命令行中使用了下面的脚本,这解决了我的问题,我能够通过我的管理网站正确访问审批页面,并在上面进行所有的增删改查操作。
CREATE TABLE "myapp_approval" ("id" integer NOT NULL PRIMARY KEY, "desc" varchar(256) NOT NULL);
谢谢大家的帮助和支持!