нельзя сделать миграцию нескольких баз данных в Django 2.2 - PullRequest
0 голосов
/ 21 июня 2019

Независимо от того, какую базу данных я использую при выполнении ./manage.py migrate, она переносит все таблицы в базу данных.

Цель

Цель состоит в том, чтобы иметь приложение, которое было бы доступно всем моделям.в этом приложении перейдите к отдельной базе данных, другие модели, такие как django-admin, перейдут по умолчаниюмое новое приложение, к соединению с базой данных default.

Затем, когда я запускаю ./manage.py migrate --database=otherdatabase, оно переносит только те модели в новом приложении или вообще не переносит их.

Это может бытьошибочное ожидание, но я понимаю, что должно произойти.

Что происходит

Независимо от того, какую базу данных я использую при выполнении ./manage.py migrate, она переносит все таблицы в базу данных.

Действия по воспроизведению

  1. Установка Создание виртуальной среды
  2. Настройка базы данных postgres.Я делаю этот докер "Throud"
version: "3"

services:
  db:
    image: postgres:10.1-alpine
    environment:
      POSTGRES_DB: "database1"
      POSTGRES_USER: "postgres"
    ports:
      - 5432:5432
Установить psycopg2-binary и Django django-admin.py startproject routing Редактировать 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',
    }
}
Создать базу данных database2 в postgres Создать новое приложение ./manage.py startapp integrations Добавить integrations приложение в INSTALLED_APPS в settings.py Создать файлrouter.py в integrations приложении Скопируйте в него следующий код.Это всего лишь модификация документа 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
Добавьте следующее к settings.py для используемого маршрутизатора базы данных
DATABASE_ROUTER = ['integrations.router.IntegrationRouter']
Запустить команду миграции ./manage.py migrate.Необходимо выполнить все миграции Запустить команду миграции ./manage.py migrate --database=database2.Миграции не должны выполняться, но в моей системе они есть.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...