【问题标题】:One Django App/Model to Multiple databases一个 Django 应用程序/模型到多个数据库
【发布时间】:2021-10-08 14:49:34
【问题描述】:

我在一个 Django 项目中,出于性能和路线图的原因,我需要使用 Multi-BDD 系统。

但是我有点卡住了,让我解释一下,我创建了数据库,我添加了一个路由 URL 来指定使用哪个数据库以及何时使用它。 我有一个“此项目中的应用程序”以及一个唯一且唯一的“数据库模型”,在我的迁移过程中,最后一个(模型)在逻辑上必须在我的所有数据库中复制。 问题:

为什么当我迁移这个模型时,它只迁移到一个数据库中而不是另一个数据库中,而迁移表是重复的,我不明白为什么以及如何 ???? 我会很感激你的反馈。 提前谢谢你!

这是我的 settings.py

# Including le DB_Router
DATABASE_ROUTERS = ['routers.db_routers.AuthRouter',
                    'routers.db_routers.VIGRouter',
                    'routers.db_routers.VISRouter',
                    'routers.db_routers.DURRouter',
                    'routers.db_routers.IPCRouter',
                    ]

DATABASES = {
    'default': {},
    'izlog': {
        'ENGINE': ENGINE,
        'NAME': 'izlog',
        'USER': USER,
        'PASSWORD': PASSWORD,
        'HOST': HOST,
        'PORT': PORT,
    },
    'db_vig': {
        'ENGINE': ENGINE,
        'NAME': DBSNAME['db_VIG'],
        'USER': USER,
        'PASSWORD': PASSWORD,
        'HOST': HOST,
        'PORT': PORT,
    },
    'db_vis': {
        'ENGINE': ENGINE,
        'NAME': DBSNAME['db_VIS'],
        'USER': USER,
        'PASSWORD': PASSWORD,
        'HOST': HOST,
        'PORT': PORT,
    },
这是我的 db_routers.py

class VIGRouter:
    route_app_labels = {'izLogApp'}

    def db_for_read(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'db_vig'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'db_vig'
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label in self.route_app_labels:
            return db == 'db_vig'
        return None


class VISRouter:
    route_app_labels = {'izLogApp'}

    def db_for_read(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'db_vis'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label in self.route_app_labels:
            return 'db_vis'
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label in self.route_app_labels:
            return db == 'db_vis'
        return None

这是我的模型

class log_weblinks(models.Model):
    id_societe = models.CharField(max_length=32, null=True)
    code_client = models.CharField(max_length=32, null=True)
    date = models.DateTimeField(null=True)
    log = models.CharField(max_length=32, null=True)

    def __str__(self):
        return self.id_societe

    def readableDateCommande(self):
        date_time_obj = datetime.datetime.strptime(self.date, '%Y%m%d')
        return date_time_obj.strftime('%Y-%m-%d HH:MM:SS')


class connexion_log_weblinks(models.Model):
    id_societe = models.CharField(max_length=32, null=True)
    code_client = models.CharField(max_length=32, null=True)
    date = models.DateTimeField(null=True)
    log = models.CharField(max_length=32, null=True)

    def __str__(self):
        return self.log

    def readableDateCommande(self):
        date_time_obj = datetime.datetime.strptime(self.date, '%Y%m%d')
        return date_time_obj.strftime('%Y-%m-%d HH:MM:SS')

【问题讨论】:

    标签: django database


    【解决方案1】:

    我猜你使用 python manage.py migrate 来应用你的迁移。此命令仅适用于默认数据库。运行多数据库应用时,您需要使用--database 选项指定目标数据库。

    例如:python manage.py migrate --database db_vig

    【讨论】:

    • 我曾经这样做过,但结果相同,我想我应该为每个数据库指定 ENGINE,对吗?
    猜你喜欢
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 2018-07-29
    • 2016-10-11
    • 1970-01-01
    • 2017-03-04
    • 2013-04-25
    相关资源
    最近更新 更多