【发布时间】:2021-08-30 13:29:00
【问题描述】:
我有数据库db1 和db2。应该使用相同的迁移脚本创建两个 DB 的模式。
Django 文档提到了DATABASE_ROUTERS 和RunPython,但到目前为止我还没有设法让它工作。函数被调用,但migrations.CreateModel()从函数调用时没有影响:没有创建表。
迁移脚本:
# 0001_initial.py
def forwards(apps, schema_editor):
if schema_editor.connection.alias == 'db1':
print('This line is called!')
migrations.CreateModel(
name='MyModel',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
# ...
]
)
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.RunPython(forwards, hints={'target_db': 'db1'}),
]
路由器:
DatabaseRouter:
# ...
def allow_migrate(self, db, app_label, model_name=None, **hints):
if 'target_db' in hints:
return db == hints['target_db']
return True
命令:
python manage.py migrate --database=db1
有什么想法吗?提前致谢!
【问题讨论】:
-
你为什么不把
migrations.CreateModel写在operations列表中呢?实际上,您为什么还要编写迁移以手动制作模型?只需在models.py中编写模型的代码并运行makemigrations,您将自动获得一个迁移文件... -
@AbdulAzizBarkat 我需要在某处定义在哪个数据库中创建的模型不是由
makemigrations完成的。你会怎么做? -
那当然是在 router 中的
allow_migrate方法中完成的。您将检查传递的app_label和数据库别名db并返回True以防它应该迁移到那里,False如果不是,None如果其他路由器应该决定。 -
感谢您的提示。你有我可以使用和接受的有效答案吗?
标签: python django django-models django-rest-framework django-migrations