Независимо от того, какую базу данных я использую при выполнении ./manage.py migrate
, она переносит все таблицы в базу данных.
Цель
Цель состоит в том, чтобы иметь приложение, которое было бы доступно всем моделям.в этом приложении перейдите к отдельной базе данных, другие модели, такие как django-admin, перейдут по умолчаниюмое новое приложение, к соединению с базой данных default
.
Затем, когда я запускаю ./manage.py migrate --database=otherdatabase
, оно переносит только те модели в новом приложении или вообще не переносит их.
Это может бытьошибочное ожидание, но я понимаю, что должно произойти.
Что происходит
Независимо от того, какую базу данных я использую при выполнении ./manage.py migrate
, она переносит все таблицы в базу данных.
Действия по воспроизведению
- Установка Создание виртуальной среды
- Настройка базы данных 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
.Миграции не должны выполняться, но в моей системе они есть.