把已有的数据库接入 Django 迁移,或者迁移已经在库里手工做完了,就要用 --fake。这篇看它们各自「假装」了什么,以及最容易踩的两个坑:表存在但少列、fake 之后记录与实际不一致。
migrate lab → django.db.utils.ProgrammingError: relation "lab_p" already exists django_migrations 里 lab 的记录: (无)
典型场景:把一个手工建表的库接入 Django,或者从另一个 Django 项目搬来表。
['Applying lab.0001_initial... FAKED'] 记录: 0001_initial 可以正常读写: 1
['Applying lab.0001_initial... FAKED'] 之后读写: ProgrammingError: column "age" of relation "lab_p" does not exist
它对「初始迁移」有效:CreateModel 的表已存在就跳过。它不比较列类型、不检查约束,所以之前要自己确认表结构与迁移一致。
migrate lab --fake: ['Applying lab.0002_email... FAKED'] 记录: 0001_initial , 0002_email 数据库里 lab_p 的列: id,name,age ← 没有 email 之后写入: ProgrammingError: column "email" of relation "lab_p" does not exist
['Unapplying lab.0002_email... FAKED', 'Unapplying lab.0001_initial... FAKED'] 记录: (无) 表 lab_p 还在吗: 1
适合「手工在库里做完了这个变更,补一条记录」。风险是记录与实际不符时,之后的查询才报错(而不是迁移时)。