Django中makemigrations和migrate命令如何同步数据库迁移?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1173个文字,预计阅读时间需要5分钟。
当你没有修改`models.py`文件时,执行`python manage.py makemigrations`命令,结果会显示没有检测到更改,但仍然会生成一个空迁移文件(例如`0002_auto_20240510_1523.py`)。这是因为模型类中可能写入了动态内容,例如使用`default=datetime.now()`而不是`default=datetime.now()`(注意括号)。Django每次运行`makemigrations`都会重新导入模型,如果默认值是函数调用(带括号),它每次都会看到不同的当前时间,因此认为字段发生了变化。
- 正确写法:
default=timezone.now(不带括号,传函数对象)或default=datetime.now(同理) - 错误写法:
default=datetime.now()或default=uuid4()(立即执行,每次导入都不同) - 另一个常见原因:修改了
Meta.ordering、verbose_name等不影响数据库结构的属性,Django 默认不忽略它们——可加--name手动跳过,或在settings.py中设MIGRATION_MODULES后统一管理
migrate 执行时报错 “Table already exists” 怎么办
典型错误信息:django.db.utils.ProgrammingError: relation "myapp_mymodel" already exists。
本文共计1173个文字,预计阅读时间需要5分钟。
当你没有修改`models.py`文件时,执行`python manage.py makemigrations`命令,结果会显示没有检测到更改,但仍然会生成一个空迁移文件(例如`0002_auto_20240510_1523.py`)。这是因为模型类中可能写入了动态内容,例如使用`default=datetime.now()`而不是`default=datetime.now()`(注意括号)。Django每次运行`makemigrations`都会重新导入模型,如果默认值是函数调用(带括号),它每次都会看到不同的当前时间,因此认为字段发生了变化。
- 正确写法:
default=timezone.now(不带括号,传函数对象)或default=datetime.now(同理) - 错误写法:
default=datetime.now()或default=uuid4()(立即执行,每次导入都不同) - 另一个常见原因:修改了
Meta.ordering、verbose_name等不影响数据库结构的属性,Django 默认不忽略它们——可加--name手动跳过,或在settings.py中设MIGRATION_MODULES后统一管理
migrate 执行时报错 “Table already exists” 怎么办
典型错误信息:django.db.utils.ProgrammingError: relation "myapp_mymodel" already exists。

