python manage.py migrate --fake <appname> vs python manage.py migrate --fake <appname> 零

python manage.py migrate --fake <appname> vs python manage.py migrate --fake <appname> zero

当我 运行 python manage.py migrate --fake photos zero :

Operations to perform:
Unapply all migrations: photos Running migrations: Rendering model states... DONE
Unapplying photos.0001_initial... FAKED

在运行ning上面的命令后,我运行python manage.py migrate当时就出现了这个错误。

Traceback:Traceback (most recent call last):

File "C:\Users...\lib\site-packages\django\db\backends\sqlite3\base.py", line 411, in execute return Database.Cursor.execute(self, query)

django.db.utils.OperationalError: table "photos_userphoto" already exists

当我运行python manage.py migrate --fake photos:

Operations to perform: Apply all migrations: photos Running migrations: Applying photos.0001_initial... FAKED Applying photos.0002_auto_20210303_0120... FAKED

在 运行 上面的命令之后,我 运行 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 标志有误解。根据 documentation --fake 标志:

Marks the migrations up to the target one (following the rules above) as applied, but without actually running the SQL to change your database schema.

它还进一步指出,它适用于手动进行更改的高级用户。基本上 Django 使用 table django_migrations 来管理你的迁移。它向其中添加一个条目以标记是否已应用迁移。 --fake 所做的只是根据您指定的迁移向 table 添加条目/从中删除条目。另外 zero 表示撤消所有迁移。

python manage.py migrate --fake photos zero

上面的命令意味着你基本上对 Django 说:

I have or will manually remove(d) all the tables, etc. from the database for the app photos

python manage.py migrate --fake <appname>

在上面的命令中你没有指定迁移(之前你指定了零),这意味着假设你的意思是直到最近的迁移。基本上 --fake 这个命令意味着:

I have or will manually make all the tables, etc. in the database for the migrations till the most recent one.

根据我的理解,您只做了一些更改并想更新您的数据库,为此您可以简单地写成:

python manage.py migrate