Django South – 表已经存在
我正在尝试与南方开始。 我有一个现有的数据库,我加了南( syncdb
, schemamigration --initial
)。
然后,我更新了models.py
来添加一个字段并运行./manage.py schemamigration myapp --auto
。 它似乎find了领域,并说我可以申请./manage.py migrate myapp
。 但是,这样做给了错误:
django.db.utils.DatabaseError: table "myapp_tablename" already exists
tablename
是models.py
中列出的第一个表格。
我正在运行Django 1.2,南0.7
由于您已经有了在数据库中创build的表,所以您只需要将初始迁移运行为假
./manage.py migrate myapp --fake
确保模型的模式与数据库中表的模式相同。
尽pipe表“myapp_tablename”已经存在错误,但是在执行./manage.py迁移myapp –fake后,发生错误,DatabaseError不显示这样的列:myapp_mymodel.added_field。
得到完全相同的问题!
首先检查造成这种情况的移民人数 。 让我们假设它是:0010。
你需要:
./manage.py schemamigration myapp --add-field MyModel.added_field ./manage.py migrate myapp
如果有多个领域缺失,你必须重复每个领域。
3.现在你着陆了一堆新的迁移,所以删除他们的文件从myapp / migrations(0011,如果你需要添加多个字段进一步)。
运行这个:
./manage.py migrate myapp 0010
现在尝试./manage.py迁移myapp
如果它没有失败,你准备好了。 只要重新检查,如果有任何领域的遗漏。
编辑:
当你有一个生产数据库,你安装南和第一,在其他环境中创build的初始迁移重复你已经在你的数据库中,也可以发生此问题。 这里的解决scheme要容易得多:
-
假第一次迁移:
./manage migrate myapp 0001 –fake
-
与其余的迁移一起滚动:
./manage迁移myapp
当我遇到这个错误时,它有一个不同的原因。
在我的情况下,南不知何故在我的数据库中留下了一个临时的空表,这是在_remake_table()中使用 。 可能我以一种我不应该有的方式stream产了。 在任何情况下,每个后续的新迁移,当它调用_remake_table()时,抛出错误sqlite3.pypysqlite2.dbapi2.OperationalError: table "_south_new_myapp_mymodel" already exists
,因为它已经存在,不应该在那里。
_south_new对我来说看起来很奇怪,所以我浏览了我的数据库,看到了桌子_south_new_myapp_mymodel
,划伤了我的脑袋,看着South的源头 , _south_new_myapp_mymodel
它是垃圾,放下桌子,一切都很好。
Perform these steps in order may help you
:
1)python manage.py schemamigration apps.appname –initial
上面的步骤创build迁移文件夹为默认。
2)python manage.py migrate apps.appname –fake
生成一个假的迁移。
3)python manage.py schemamigration apps.appname –auto
然后,您可以根据需要添加字段并执行上述命令。
4)python manage.py迁移apps.appname
如果您的模型与您的数据库不匹配(例如@pielgrzym),并且想要自动迁移数据库以匹配最新的models.py文件(并删除migrate
过程中不会由夹具重新创build的所有数据),则:
manage.py schemamigration myapp --initial manage.py migrate myapp --fake manage.py migrate myapp zero manage.py migrate myapp
这只会删除和重新创build最新的models.py
文件中的数据库表,所以您可能会在以前的syncdb
存在垃圾表或migrate
数据库。 要摆脱这些,在所有这些迁移之前:
manage.py sqlclear myapp | manage.py sqlshell
如果这仍然留下一些CRUFT躺在你的数据库中,那么你必须做一个inspectdb
并创buildmodels.py
文件(对于你想清除的表和应用程序),然后再执行sqlclear
,然后恢复原始models.py在创build – --initial
迁移并迁移到它之前。 所有这些都是为了避免搞乱数据库所需要的SQL的特殊风格。
如果你有一个现有的数据库和应用程序,你可以使用南转换命令
./manage.py convert_to_south myapp
在对数据库中已有内容进行任何更改之前 ,必须先应用此function。
convert_to_south命令只能在你运行的第一台机器上运行。 一旦你完成了对VCS的初始迁移,你将不得不运行./manage.py migrate myapp 0001 --fake
在每个拥有代码库副本的机器上创build(确保它们是最新的,date与模型和架构第一)。 ref: http : //south.readthedocs.org/en/latest/convertinganapp.html
作为临时解决scheme,您可以在迁移脚本中注释表创build。
class Migration(migrations.Migration): dependencies = [ (...) ] operations = [ #migrations.CreateModel( # name='TABLE', # fields=[ # .... # .... # ], #), .... ....
要么
如果现有的表不包含行(空),则考虑删除如下的表。 (只有当表不包含行时,才build议使用此修补程序 。 在createModel操作之前也要确保这个操作。
class Migration(migrations.Migration): dependencies = [ (...), ] operations = [ migrations.RunSQL("DROP TABLE myapp_tablename;") ]
再一个解决scheme(也许是一个临时解决scheme)
$ python manage.py sqlmigrate APP_NAME MIGRATION_NAME
例如。,。
$ python manage.py sqlmigrate users 0029_auto_20170310_1117
这将列出原始sql查询中的所有迁移。 您可以select要运行的查询,避免创build现有表的部分