姜戈南表已经存在

我试图开始与南方。我有一个现有的数据库,我添加了南方(syncdbschemamigration --initial)。

然后,我更新了 models.py以添加一个字段并运行 ./manage.py schemamigration myapp --auto。它似乎找到了这个领域,并说我可以应用这与 ./manage.py migrate myapp。但是,这样做的结果是错误的:

django.db.utils.DatabaseError: table "myapp_tablename" already exists

tablenamemodels.py中列出的第一个表。

我正在运行姜戈1.2,南0.7

67296 次浏览

因为已经在数据库中创建了表,所以只需要以假的方式运行初始迁移

./manage.py migrate myapp --fake

确保模型的模式与数据库中表的模式相同。

虽然表“ myapp _ tablename”已经存在错误,但停止引发 在我这样做之后。/manage.py 迁移了我的应用程序—— DatabaseError 显示为假的 没有这样的列: myapp _ mymodel. add _ field。

我也有同样的问题!

1. 首先是 检查移民号码引起的,假设它是: 0010。

2. 你需要:

./manage.py schemamigration myapp --add-field MyModel.added_field
./manage.py migrate myapp

如果有多个字段丢失,你必须为每个字段重复它。

3.现在有了一大堆新的迁移,所以从 myapp/ 移植(0011,如果您需要添加多個字段,可以更進一步)生成 删除他们的文件

4. 运行以下命令:

./manage.py migrate myapp 0010

现在尝试./management. py 迁移 myapp

如果它没有失败,你已经准备好了。只要再次检查是否有任何字段丢失。

编辑:

当您为一个生产数据库安装 South 并且在其他环境中创建的初始迁移与数据库中已有的内容重复时,也会出现这个问题。这里的解决方案要简单得多:

  1. 假装第一次迁移:

    。/管理迁移我的应用程序0001-假

  2. 与其他迁移一起滚动:

    ./管理迁移我的应用程序

当我遇到这个错误时,原因是不同的。

在我的情况下,South 不知何故在我的 DB 中留下了一个临时的空表,这在 _ remake _ table ()中使用。也许我以一种不应该的方式放弃了一次迁移。在任何情况下,每次后续的新迁移(称为 _ remake _ table ())都会抛出错误 sqlite3.pypysqlite2.dbapi2.OperationalError: table "_south_new_myapp_mymodel" already exists,因为它 是的已经存在,而且不应该存在。

对我来说,这个 _ south _ new 位看起来很奇怪,所以我浏览了我的数据库,看到了表 _south_new_myapp_mymodel,挠了挠头,看了看 南方的线人,确定它是垃圾,放下了表,一切都很好。

返回文章页面

1) python management. py 模式迁移 apps.appname —— initial.py

上面的步骤默认创建迁移文件夹。

2) python manage.py 迁移 apps.appname ——假的

会产生假的迁移。

3) python manage.py 模式迁移 apps.appname —— auto

然后您可以根据需要添加字段并执行上面的命令。

4) python manage.py 迁移 apps.appname

如果你有一个现有的数据库和应用程序,你可以使用南转换命令

./manage.py convert_to_south myapp

这必须被应用到 之前中,对数据库中已经存在的内容进行任何更改。

Convert _ to _ south 命令只能在运行它的第一台计算机上完全工作。一旦提交了它在 VCS 中进行的初始迁移,就必须在每台拥有代码库副本的机器上运行 ./manage.py migrate myapp 0001 --fake(首先要确保它们是最新的模型和模式)。 参考文献: http://south.readthedocs.org/en/update/Convertinganapp.html/rel = “ nofollow”> http://south.readthedocs.org/en/latest/convertinganapp.html

如果您的模型与数据库不匹配,比如@pielgrzym,并且您希望自动迁移数据库以匹配最新的 model. py 文件(并删除在 migrate期间不会由 fixture 重新创建的任何数据) :

manage.py schemamigration myapp --initial
manage.py migrate myapp --fake
manage.py migrate myapp zero
manage.py migrate myapp

这只会删除和重新创建存在于最新的 models.py文件中的数据库表,因此您的数据库中可能存在来自以前的 syncdbmigrate的垃圾表。为了消除这些问题,在所有这些迁移之前都要加上:

manage.py sqlclear myapp | manage.py sqlshell

如果数据库中还有 CRUFT 文件,那么在执行 sqlclear之前,你必须先执行 inspectdb并从中创建 models.py文件(用于您想要清除的表和应用程序) ,然后在创建 --initial迁移并迁移到它之前恢复原来的 model. py。所有这些都是为了避免与数据库所需的特定 SQL 风格发生冲突。

作为临时解决方案,您可以在迁移脚本中注释 Table 的创建。

class Migration(migrations.Migration):


dependencies = [
(...)
]


operations = [
#migrations.CreateModel(
#    name='TABLE',
#    fields=[
#            ....
#            ....
#    ],
#),
....
....

或者

如果现有的表不包含任何行(空) ,那么可以考虑像下面这样删除该表。(只有在表中不包含行的情况下,才建议使用此修复程序).还要确保在 createModel 操作之前执行此操作。

class Migration(migrations.Migration):


dependencies = [
(...),
]


operations = [
migrations.RunSQL("DROP TABLE myapp_tablename;")
]

还有一个解决方案(也许是暂时的解决方案)。

$ python manage.py sqlmigrate APP_NAME MIGRATION_NAME

例如:。

$ python manage.py sqlmigrate users 0029_auto_20170310_1117

这将列出原始 sql 查询中的所有迁移。您可以选择要运行的查询,以避免创建现有表的部分