python manage.py migrate 降落错误

0 投票
1 回答
525 浏览
提问于 2025-04-18 01:33

我想用 South 迁移我的应用 "landing",所以我输入了以下命令:

python manage.py migrate landing

但是它显示了以下错误:

正在为 landing 运行迁移:

  • 正在向前迁移到 0003_auto__chg_field_userinput_email2。 landing:0001_initial

致命错误 - 以下 SQL 查询失败:创建表 landing_userinput ( id 整数 自动增加 不为空 主键, name 字符串(120) 不为空, email 字符串(200) 不为空, city 字符串(120) 不为空, timestamp 日期时间 不为空)

错误信息是: (1050, "表 'landing_userinput' 已经存在") ! 在迁移的实际运行中发现错误!正在中止。

! 由于你的数据库不支持在事务中运行 ! 修改模式的语句,我们不得不将其留在迁移之间的临时状态。

! 你 可能 能通过以下方式恢复: = 删除表 landing_userinput 级联; []

引发错误类,错误值

django.db.utils.OperationalError: (1050, "表 'landing_userinput' 已经存在")

请给我一些建议来解决这个错误。

1 个回答

0

不要同时使用 syncdbmigrate;这样会产生冲突,因为初始迁移会创建一个空表。

如果你有一个新的应用程序,并希望用 south 来管理它,操作步骤如下:

  1. ./manage.py schemamigration landing --initial -- 这一步是创建初始迁移,它会为你的应用程序创建表。你只需要做这一步 一次
  2. ./manage.py migrate landing -- 这一步会应用迁移。第一次执行这条命令(配合上面的第一步),会在数据库中创建一个空表。

完成前两步后,每当你对模型进行更改时,都需要运行这两条命令:

  1. ./manage.py schemamigration landing --auto -- 这条命令会创建一个包含你模型更改的文件(即迁移)。

  2. ./manage.py migrate landing -- 这条命令会应用新的迁移(和上面的一样);它会影响到你的数据库更改。

如果你已经有一个现有的应用程序,先安装 south,然后运行 syncdb 来创建 south 自己的数据库表,然后运行 ./manage.py convert_to_south yourappname;这会进行一次“假”的迁移,并将其设置为模型的最后状态。接着,按照 schemamigration yourappname --automigrate 的步骤进行。

在你的情况下,你有两个选择:

  1. 删除表(正如错误提示所建议的)。这会删除所有数据。如果你在开发阶段,这是重新开始的最简单方法(如果你想为模型提供一些默认数据,应该使用 fixtures)。

  2. 你可以使用 --fake 选项来欺骗 south,让它认为操作已经完成。更多信息请查看 文档

撰写回答