У меня есть два postgres db в моем проекте, по одному для каждого приложения: app1: Store, app2: Warehouse. У обоих из них есть модель заказа, которую django называет: store_order & warehouse_order (я в порядке с этой частью);
Но после миграции возникает проблема, и store_order, и warehouse_order попали в warehouse_db, а также все эти таблицы django, которые я хочу видеть только в 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
Я просто запустил его снова на следующий день и получил:
Я не понимаю, почему. Я изменил скрипт миграции на:
#!/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 должны быть только в хранилище базы данных. Я положу ответ здесь, если найду один.