【发布时间】:2018-08-03 17:02:02
【问题描述】:
我在开发环境中使用 Django 和 SQLite,在生产环境中使用 postgreSQL。我知道为 dev 和 prod 拥有不同的数据库后端是一项技术债务,但这是目前的情况(希望不会长久)。
我想在生产中利用 postgres JSONField,而在开发中继续使用django-jsonfield。有没有办法编写迁移,以便它可以根据当前使用的后端有条件地在两种类型的字段之间切换?
【问题讨论】:
我在开发环境中使用 Django 和 SQLite,在生产环境中使用 postgreSQL。我知道为 dev 和 prod 拥有不同的数据库后端是一项技术债务,但这是目前的情况(希望不会长久)。
我想在生产中利用 postgres JSONField,而在开发中继续使用django-jsonfield。有没有办法编写迁移,以便它可以根据当前使用的后端有条件地在两种类型的字段之间切换?
【问题讨论】:
嗯,有趣。我认为这将是一个重复的问题,或者会记录一个直接的方法来做到这一点,但如果是这样,我找不到它。
文档确实有一个关于Data migrations and multiple databases 的部分,但那里的技术仅适用于RunPython 和RunSQL 操作。它们是:
将hints 参数添加到您的RunPython 或RunSQL 操作。该值将被传递到数据库路由器,您可以在其中决定是否应应用该操作。
在RunPython 函数中,检查schema_editor.connection.alias 以确定正在使用的数据库,然后打开它。不幸的是,schema_editor 没有在 Migration 类中公开。
查看code,您可以覆盖apply() 方法,因为这确实暴露了schema_editor。
class Migration(migrations.Migration):
dependencies = [...]
operations = [...]
def apply(self, project_state, schema_editor, collect_sql=False):
if schema_editor.connection.alias == "my_sqlite_database":
return super().apply(project_state, schema_editor, collect_sql=collect_sql)
else:
return project_state
请注意,这是未经测试的,并且依赖于未记录的行为。我希望有更好的解决方案。
【讨论】: