无法在Django 2.2中进行多个数据库的迁移

时间:2019-06-21 04:23:48

标签: django database postgresql

无论我在使用./manage.py migrate时使用什么数据库,它都会将所有表迁移到数据库中。

目标

目标是能够拥有一个应用程序,该应用程序中的所有模型都将进入单独的数据库,而其他模型(如django-admin)将变为默认数据库。

预期

我希望当我不针对任何数据库时,它将所有现有迁移(而不是在我的新应用中)迁移到default数据库连接。

然后,当我运行./manage.py migrate --database=otherdatabase时,它只会在新应用中迁移那些模型,或者根本不迁移。

这可能是一个错误的期望,但这是我对应该发生的事情的理解。

发生了什么

无论我在使用./manage.py migrate时使用什么数据库,它都会将所有表迁移到数据库中。

复制步骤

  1. 安装创建虚拟环境
  2. 设置一个postgres数据库。我正在通过docker
version: "3"

services:
  db:
    image: postgres:10.1-alpine
    environment:
      POSTGRES_DB: "database1"
      POSTGRES_USER: "postgres"
    ports:
      - 5432:5432
  1. 安装psycopg2-binaryDjango
  2. django-admin.py startproject routing
  3. 编辑routing/settings.py,将以下内容添加到数据库中
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'database1',
        'USER': 'postgres',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '5432',
    },
    'database2': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'database2',
        'USER': 'postgres',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}
  1. 在postgres中创建数据库database2
  2. 创建一个新应用./manage.py startapp integrations
  3. integrations应用添加到INSTALLED_APPS中的settings.py
  4. router.py应用中创建文件integrations
  5. 将以下代码复制到其中。仅仅是对Django文档的修改。
APP_LABEL = "integrations"
DB_CONNECTION_NAME = "database2"


class IntegrationRouter:
    def db_for_read(self, model, **hints):
        if model._meta.app_label == APP_LABEL:
            return DB_CONNECTION_NAME
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == APP_LABEL:
            return DB_CONNECTION_NAME
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label == APP_LABEL or obj2._meta.app_label == APP_LABEL:
           return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == APP_LABEL:
            return db == DB_CONNECTION_NAME
        return None
  1. settings.py中添加以下内容以使用数据库路由器
DATABASE_ROUTER = ['integrations.router.IntegrationRouter']
  1. 运行迁移命令./manage.py migrate。它应该运行所有迁移
  2. 运行迁移命令./manage.py migrate --database=database2。不应运行任何迁移,但应在我的系统上进行。

0 个答案:

没有答案