【发布时间】:2023-03-28 14:52:02
【问题描述】:
环境: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
}
}
问题是在设置中可能为所有数据库别名设置了相同的数据库。
当我运行 migrate 时,迁移仅应用于其中一个数据库,但并不总是应用于所需的一个。例如,它被应用于“默认”,但不是“mydb03”。
我想错误在我的路由器中,但找不到正确的实现。
【问题讨论】:
-
这个问题似乎很难跟踪和修复。我最终在一个数据库(postgresql)中拥有不同的架构。
-
您使用任何选项配置吗?像这样:"'options': -c search_path=schema, public" 如果是,尝试去掉逗号后的public。
-
是的,但这根本不能解决问题。而且你可能不仅有 postgres。
-
我也有这个问题,使用 multipls 模式(每个模式都是 django 设置上的不同数据库),但删除公共选项对我有用。
-
在我的情况下,它们是一个环境中的相同数据库和模式。这正是问题所在 - 存储迁移表的位置。