【问题标题】:Django migrate multiple databasesDjango 迁移多个数据库
【发布时间】:2023-03-28 14:52:02
【问题描述】:

环境:Django 2、Python 3.6、PostgreSQL(可选)

我正在编写一个包含多个模型的应用程序,其中一些可能存储在不同的数据库中。

例子:

models.py(可能在不同的应用中)

# this used to allow field 'database' to be processed in 'Meta'
models.options.DEFAULT_NAMES = models.options.DEFAULT_NAMES + ('database', )

class MyModel01(models.Model):
    ...
    # this goes to default database


class MyModel02(models.Model):
    ...

    class Meta:
        database = 'mydb02'


class MyModel03(models.Model):
    ...

    class Meta:
        database = 'mydb03'

routers.py:

class MyRouter(object):
    def db_for_read(self, model, **hints):
        return getattr(model._meta, 'database', None)

    def db_for_write(self, model, **hints):
        return getattr(model._meta, 'database', None)

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        model = hints.get('model')
        if not model:
            return None
        if db != 'default':
            modelname = model_name or model._meta.model_name
            usedb = getattr(model._meta, 'database', None)
            if not usedb:
                return False

            if modelname and usedb:
                return usedb == db
            return False
        else:
            usedb = getattr(model._meta, 'database', 'default')
            return usedb == db
        return None

设置:

DATABASES: {
    'default': {
        # some db settings
    },
    'mydb02': {
        # db settings
    },
    'mydb03': {
        # the SAME db settings as for mydb02
    }
}

问题是在设置中可能为所有数据库别名设置了相同的数据库。

当我运行 migrate 时,迁移仅应用于其中一个数据库,但并不总是应用于所需的一个。例如,它被应用于“默认”,但不是“mydb03”。

我想错误在我的路由器中,但找不到正确的实现。

【问题讨论】:

  • 这个问题似乎很难跟踪和修复。我最终在一个数据库(postgresql)中拥有不同的架构。
  • 您使用任何选项配置吗?像这样:"'options': -c search_path=schema, public" 如果是,尝试去掉逗号后的public。
  • 是的,但这根本不能解决问题。而且你可能不仅有 postgres。
  • 我也有这个问题,使用 multipls 模式(每个模式都是 django 设置上的不同数据库),但删除公共选项对我有用。
  • 在我的情况下,它们是一个环境中的相同数据库和模式。这正是问题所在 - 存储迁移表的位置。

标签: python django migration


【解决方案1】:

您可以指定使用哪个数据库:

python3 manage.py migrate # default database
python3 manage.py migrate --database mydb02
python3 manage.py migrate --database mydb03

https://docs.djangoproject.com/en/2.0/topics/db/multi-db/#synchronizing-your-databases

【讨论】:

  • 是的,当然,这是为其他数据库别名运行迁移的唯一方法。但是,如果“默认”首先出现 - 它可能会收到迁移,而不是为它准备的。 这就是问题。
  • 您可以配置一个 routerdb 以在公共场合忽略某些模型。这对我有用。
猜你喜欢
  • 2016-06-07
  • 2014-01-13
  • 2017-01-22
  • 2018-03-04
  • 2013-03-06
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多