环境:Django 2,Python 3.6,PostgreSQL(可选)
我正在编写一个包含多个模型的应用程序,其中一些可能存储在不同的数据库中。
示例:
models.py(可能在不同的应用中)
# this used to allow field 'database' to be processed in 'Meta'
models.options.DEFAULT_NAMES = models.options.DEFAULT_NAMES + ('database', )
class MyModel01(models.Model):
...
# this goes to default database
class MyModel02(models.Model):
...
class Meta:
database = 'mydb02'
class MyModel03(models.Model):
...
class Meta:
database = 'mydb03'
routers.py:
class MyRouter(object):
def db_for_read(self, model, **hints):
return getattr(model._meta, 'database', None)
def db_for_write(self, model, **hints):
return getattr(model._meta, 'database', None)
def allow_migrate(self, db, app_label, model_name=None, **hints):
model = hints.get('model')
if not model:
return None
if db != 'default':
modelname = model_name or model._meta.model_name
usedb = getattr(model._meta, 'database', None)
if not usedb:
return False
if modelname and usedb:
return usedb == db
return False
else:
usedb = getattr(model._meta, 'database', 'default')
return usedb == db
return None
设置:
DATABASES: {
'default': {
# some db settings
},
'mydb02': {
# db settings
},
'mydb03': {
# the SAME db settings as for mydb02
}
}
问题是在设置中可能存在所有数据库别名的相同数据库集。
当我运行迁移时,迁移仅应用于其中一个数据库,但并不总是应用于所需的数据库。例如,它会应用于'默认'但不适用于' mydb03'。
我认为错误在我的路由器中,但无法找到正确的实现。
答案 0 :(得分:0)
您可以指定要使用的数据库:
python3 manage.py migrate # default database
python3 manage.py migrate --database mydb02
python3 manage.py migrate --database mydb03
https://docs.djangoproject.com/en/2.0/topics/db/multi-db/#synchronizing-your-databases