Мультибазы данных в Django: неуместные таблицы - PullRequest
0 голосов
/ 03 мая 2018

У меня есть два postgres db в моем проекте, по одному для каждого приложения: app1: Store, app2: Warehouse. У обоих из них есть модель заказа, которую django называет: store_order & warehouse_order (я в порядке с этой частью); Но после миграции возникает проблема, и store_order, и warehouse_order попали в warehouse_db, а также все эти таблицы django, которые я хочу видеть только в store_db:

warehouse_db store_db


github repo

settings.py

DATABASES = {
    'default': {},
    'store': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'store_db',
        'PORT': 5432,
    },
    'warehouse': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'warehouse_db',
        'PORT': 5432,
    }
}

DATABASE_ROUTERS = ['warehouse.router.WarehouseRouter', 'store.router.StoreRouter']

склад / router.py

class WarehouseRouter:
    """
    A router to control operations in warehouse app
    """
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'warehouse':
            return 'warehouse'
        else:
            return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'warehouse':
            return 'warehouse'
        else:
            return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'warehouse':
            return db == 'warehouse'
        return None

магазин / router.py

class StoreRouter:
    """
    A router to control operations in store app
    """
    def db_for_read(self, model, **hints):
        return 'store'

    def db_for_write(self, model, **hints):
        return 'store'

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return True

warehouse / models.py также как store / models.py, за исключением app_label

class Order(models.Model):
    id = models.CharField(max_length=128, null=False, unique=True, primary_key=True, default=uuid.uuid1)
    amount = models.IntegerField(null=False)
    price = models.FloatField(null=False)
    comment = models.TextField(null=True)
    created_at = models.DateTimeField(null=False, auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


def __str__(self):
    return f'{self.id}: {self.created_at}'

class Meta:
    app_label = 'warehouse'

Я пытался быть как можно ближе к этому примеру

и мой скрипт миграции

#!/bin/sh -

docker-compose run crestopher python manage.py makemigrations
docker-compose run crestopher python manage.py migrate --database=warehouse    
docker-compose run crestopher python manage.py migrate --database=store

Я также пытался выполнить makemigrations и мигрировать с одним БД, а затем с другим, но результат был тем же.


EDIT

Я просто запустил его снова на следующий день и получил:

enter image description here enter image description here

Я не понимаю, почему. Я изменил скрипт миграции на:

#!/bin/sh -

docker-compose run crestopher python manage.py makemigrations warehouse
docker-compose run crestopher python manage.py migrate --database=warehouse

docker-compose run crestopher python manage.py makemigrations store
docker-compose run crestopher python manage.py migrate --database=store

но в первый день я запускаю его около 1000 раз безрезультатно. Я попытаюсь понять, что происходит, также эти таблицы по умолчанию django должны быть только в хранилище базы данных. Я положу ответ здесь, если найду один.

...