Django South - 从sqlite3删除表后迁移未重新创建模型

0 投票
2 回答
770 浏览
提问于 2025-04-18 12:43

我刚开始学习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 个回答

0

你已经创建了一个迁移,用来建立新的数据表,并且根据South的历史管理,你已经运行了这个迁移。可是,South并不知道你数据库里实际发生了什么变化。

你需要做的是,回到创建新表之前的那个迁移。如果你查看你的应用文件夹,会发现里面有一个 migrations 文件夹,里面有一些迁移文件。如果你是在迁移 0005 中创建的新表,那么你需要(可选地)先回退到 0005,然后再伪装成回退到 0004,最后再进行一次迁移:

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

经过很多次尝试和错误,我终于找到了一种非常简单的方法。之前我在使用south迁移时运气不太好。于是我手动从sqlite3中删除了表格,接着决定在sqlite3中手动创建这个表格,结果一切都正常运作了。

我在sqlite3的命令行中使用了下面的脚本,这解决了我的问题,我能够通过我的管理网站正确访问审批页面,并在上面进行所有的增删改查操作。

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

谢谢大家的帮助和支持!

撰写回答