Django迁移多个数据库

时间:2018-04-06 13:48:37

标签: python django migration

环境: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
    }
}

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

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

我认为错误在我的路由器中,但无法找到正确的实现。

1 个答案:

答案 0 :(得分:0)

您可以指定要使用的数据库:

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