当我运行python manage.py migrate --fake photos zero
:
要执行的操作:
取消应用所有迁移:照片运行迁移:呈现模型状态…做
取消应用photos.0001_initial……伪造
在运行上述命令后,我运行python manage.py migrate
,此时出现此错误。
Traceback:Traceback(最近一次调用):
文件"C: 用户… lib 网站 django db 后端 sqlite3 base.py",第411行,在execute中Database.Cursor返回。执行(自我,查询)
django.db.utils。OperationalError: table "photos_userphoto"已经存在
当我运行python manage.py migrate --fake photos
:
要执行的操作:Apply all migration: photos Runningmigrations: application photos.0001_initial…伪造的应用photos.0002_auto_20210303_0120……伪造
运行上述命令后,我运行python manage.py migrate
,这工作完美。
Running migrations:
Applying photos.0003_auto_20210303_0123... OK
所以我的问题是,python manage.py migrate --fake <appname>
和python manage.py migrate --fake <appname> zero
之间有什么区别,为什么第一个命令会给我一个错误?
谢谢. .
你似乎对--fake
标志有误解。根据文档--fake
标志:
将迁移标记为目标迁移(遵循上述规则),但不实际运行SQL来更改您的数据库模式。
它还进一步指出,如果高级用户手动进行更改,则意味着它是针对高级用户的。基本上Django创建了一个表django_migrations
来管理你的迁移。它将添加一个条目来标记是否应用了迁移。--fake
所做的只是根据您指定的迁移向该表添加/删除条目。另外,zero
表示撤销所有迁移。
python manage.py migrate --fake photos zero
上面的命令基本上意味着你对Django说:
我已经或将手动从数据库中删除(d)所有表等对于app photos
python manage.py migrate --fake <appname>
在上面的命令中,您没有指定迁移(在前面您指定了零),这意味着假设您指的是直到最近的迁移。对于--fake
,这个命令的意思是:
我已经或将手动使数据库中的所有表等迁移到最近的一个。
根据我的理解,你只做了一些改变,想要更新你的数据库,为此你可以简单地写:
python manage.py migrate