【问题标题】:Django migrations: how to conditionally switch between migration statements according to current DB backend?Django 迁移:如何根据当前数据库后端有条件地在迁移语句之间切换?
【发布时间】:2018-08-03 17:02:02
【问题描述】:

我在开发环境中使用 Django 和 SQLite,在生产环境中使用 postgreSQL。我知道为 dev 和 prod 拥有不同的数据库后端是一项技术债务,但这是目前的情况(希望不会长久)。

我想在生产中利用 postgres JSONField,而在开发中继续使用django-jsonfield。有没有办法编写迁移,以便它可以根据当前使用的后端有条件地在两种类型的字段之间切换?

【问题讨论】:

    标签: python django database


    【解决方案1】:

    嗯,有趣。我认为这将是一个重复的问题,或者会记录一个直接的方法来做到这一点,但如果是这样,我找不到它。

    文档确实有一个关于Data migrations and multiple databases 的部分,但那里的技术仅适用于RunPythonRunSQL 操作。它们是:

    1. hints 参数添加到您的RunPythonRunSQL 操作。该值将被传递到数据库路由器,您可以在其中决定是否应应用该操作。

    2. 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
    

    请注意,这是未经测试的,并且依赖于未记录的行为。我希望有更好的解决方案。

    【讨论】:

      猜你喜欢
      • 2015-10-07
      • 2018-03-04
      • 2018-03-11
      • 2017-07-10
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 2014-07-30
      • 1970-01-01
      相关资源
      最近更新 更多