我正在努力开始南方。我有一个现有的数据库,我添加了南(syncdb
,schemamigration --initial
)。
然后,我更新models.py
以添加字段并运行./manage.py schemamigration myapp --auto
。它似乎找到了该字段,并表示我可以将其应用于./manage.py migrate myapp
。但是,这样做会产生错误:
django.db.utils.DatabaseError: table "myapp_tablename" already exists
tablename
是models.py
中列出的第一个表格。
我正在运行Django 1.2,South 0.7
答案 0 :(得分:311)
由于您已经在数据库中创建了表,因此您只需要将初始迁移作为伪造
运行./manage.py migrate myapp --fake
确保模型的模式与数据库中表的模式相同。
答案 1 :(得分:41)
虽然表“myapp_tablename”已存在,但错误停止提升 在我执行./manage.py迁移myapp --fake后,DatabaseError显示 没有这样的专栏:myapp_mymodel.added_field。
得到完全相同的问题!
1.首先检查迁移号,这是导致此问题的原因。让我们假设它是:0010。
2.你需要:
./manage.py schemamigration myapp --add-field MyModel.added_field
./manage.py migrate myapp
如果缺少多个字段,则必须为每个字段重复该字段。
3.现在您需要进行一系列新的迁移,以便从myapp / migrations中移除文件(0011,如果您需要添加多个字段,还可以进一步删除)。
4.Run this:
./manage.py migrate myapp 0010
现在尝试./manage.py迁移myapp
如果没有失败,你就准备好了。如果没有丢失任何字段,只需双重检查。
编辑:
如果您有一个安装了South的生产数据库,并且在其他环境中创建的第一个初始迁移重复了您在db中已有的内容,则也会发生此问题。解决方案在这里更容易:
假冒第一次迁移:
./ manage migrate myapp 0001 --fake
滚动其余的迁移:
./ manage migrate myapp
答案 2 :(得分:10)
当我遇到这个错误时,它有不同的原因。
在我的情况下,South在我的数据库中以某种方式留下了一个临时空表,在_remake_table()中使用。可能我以一种我不应该拥有的方式中止了迁移。在任何情况下,每次后续的新迁移,当它调用_remake_table()时,都会抛出错误sqlite3.pypysqlite2.dbapi2.OperationalError: table "_south_new_myapp_mymodel" already exists
,因为它已经存在并且不应该存在。
_south_new位对我来说很奇怪,所以我浏览了我的数据库,看到了桌子_south_new_myapp_mymodel
,抓了我的头,看了South's source,认定它是垃圾,丢了桌子,一切都是好。
答案 3 :(得分:2)
Perform these steps in order may help you
:
1)python manage.py schemamigration apps.appname --initial
上面的步骤创建了默认的迁移文件夹。
2)python manage.py迁移apps.appname --fake
生成虚假迁移。
3)python manage.py schemamigration apps.appname --auto
然后您可以根据需要添加字段并执行上述命令。
4)python manage.py migrate apps.appname
答案 4 :(得分:2)
如果您的模型与您的数据库不匹配(如@pielgrzym),并且您希望自动迁移数据库以匹配最新的models.py文件(并清除在{期间不会被灯具重新创建的任何数据) {1}}):
migrate
这将仅删除并重新创建最新manage.py schemamigration myapp --initial
manage.py migrate myapp --fake
manage.py migrate myapp zero
manage.py migrate myapp
文件中存在的数据库表,因此您的数据库中可能包含以前models.py
或syncdb
的垃圾表。要摆脱这些,请在所有这些迁移之前使用:
migrate
如果仍然在您的数据库中留下一些CRUFT,那么您将必须执行manage.py sqlclear myapp | manage.py sqlshell
并从中创建inspectdb
文件(对于要清除的表和应用程序) )在执行models.py
之前,然后在创建sqlclear
迁移并迁移到它之前恢复原始models.py。所有这些都是为了避免弄乱数据库所需的特定SQL风格。
答案 5 :(得分:1)
如果您有现有的数据库和应用程序,则可以使用南转换命令
./manage.py convert_to_south myapp
必须先应用 对数据库中已有的内容进行任何更改。
convert_to_south命令仅在您运行它的第一台机器上完全运行。一旦您提交了它在VCS中进行的初始迁移,您就必须在每个拥有代码库副本的计算机上运行./manage.py migrate myapp 0001 --fake
(确保它们首先与模型和模式保持同步)。
参考:http://south.readthedocs.org/en/latest/convertinganapp.html
答案 6 :(得分:0)
作为临时解决方案,您可以在迁移脚本中注释表创建。
class Migration(migrations.Migration):
dependencies = [
(...)
]
operations = [
#migrations.CreateModel(
# name='TABLE',
# fields=[
# ....
# ....
# ],
#),
....
....
或
如果现有表中不包含任何行(空),请考虑删除如下所示的表。 (仅当表格中没有行时才建议使用此修补程序)。还要在createModel操作之前确保此操作。
class Migration(migrations.Migration):
dependencies = [
(...),
]
operations = [
migrations.RunSQL("DROP TABLE myapp_tablename;")
]
答案 7 :(得分:0)
另一个解决方案(可能是临时解决方案)。
$ python manage.py sqlmigrate APP_NAME MIGRATION_NAME
例如,。
$ python manage.py sqlmigrate users 0029_auto_20170310_1117
这将列出原始SQL查询中的所有迁移。您可以选择要运行的查询,避免创建现有表的部分