Одно приложение/модель Django к нескольким базам данных
Я работаю над проектом Django & по причинам производительности и RoadMaping мне нужно использовать систему Multi-BDD.
Однако я немного застрял, позвольте мне объяснить, я создал базы данных, я добавил URL'S маршрутизации, чтобы указать, какую базу данных использовать и когда ее использовать. У меня есть одно "Приложение в этом проекте", а также одна & уникальная "Модель базы данных", эта последняя (модель) логически должна быть продублирована во всех моих базах данных во время миграции. ВОПРОС:
Почему когда я мигрирую эту модель, она мигрируется только в одну базу данных, а не в другую, при этом таблица миграции дублируется, не могу понять почему и как 🙂 . Я буду благодарен за ваш ответ. Заранее спасибо!
Вот мой settings.py
# Including le DB_Router
DATABASE_ROUTERS = ['routers.db_routers.AuthRouter',
'routers.db_routers.VIGRouter',
'routers.db_routers.VISRouter',
'routers.db_routers.DURRouter',
'routers.db_routers.IPCRouter',
]
DATABASES = {
'default': {},
'izlog': {
'ENGINE': ENGINE,
'NAME': 'izlog',
'USER': USER,
'PASSWORD': PASSWORD,
'HOST': HOST,
'PORT': PORT,
},
'db_vig': {
'ENGINE': ENGINE,
'NAME': DBSNAME['db_VIG'],
'USER': USER,
'PASSWORD': PASSWORD,
'HOST': HOST,
'PORT': PORT,
},
'db_vis': {
'ENGINE': ENGINE,
'NAME': DBSNAME['db_VIS'],
'USER': USER,
'PASSWORD': PASSWORD,
'HOST': HOST,
'PORT': PORT,
},
class VIGRouter:
route_app_labels = {'izLogApp'}
def db_for_read(self, model, **hints):
if model._meta.app_label in self.route_app_labels:
return 'db_vig'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label in self.route_app_labels:
return 'db_vig'
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label in self.route_app_labels:
return db == 'db_vig'
return None
class VISRouter:
route_app_labels = {'izLogApp'}
def db_for_read(self, model, **hints):
if model._meta.app_label in self.route_app_labels:
return 'db_vis'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label in self.route_app_labels:
return 'db_vis'
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label in self.route_app_labels:
return db == 'db_vis'
return None
и вот моя модель
class log_weblinks(models.Model):
id_societe = models.CharField(max_length=32, null=True)
code_client = models.CharField(max_length=32, null=True)
date = models.DateTimeField(null=True)
log = models.CharField(max_length=32, null=True)
def __str__(self):
return self.id_societe
def readableDateCommande(self):
date_time_obj = datetime.datetime.strptime(self.date, '%Y%m%d')
return date_time_obj.strftime('%Y-%m-%d HH:MM:SS')
class connexion_log_weblinks(models.Model):
id_societe = models.CharField(max_length=32, null=True)
code_client = models.CharField(max_length=32, null=True)
date = models.DateTimeField(null=True)
log = models.CharField(max_length=32, null=True)
def __str__(self):
return self.log
def readableDateCommande(self):
date_time_obj = datetime.datetime.strptime(self.date, '%Y%m%d')
return date_time_obj.strftime('%Y-%m-%d HH:MM:SS')
Я предполагаю, что вы используете python manage.py migrate
для применения миграций. Эта команда будет работать только для базы данных по умолчанию. Если вы запускаете приложение с несколькими базами данных, вам нужно указать целевую базу данных с помощью опции --database
.
Например : python manage.py migrate --database db_vig