我正在构建一个由 Django 支持的站点,我想为一些应用程序创建单独的数据库,我构建了一个灵活的路由器,将每个应用程序路由到预定义的数据库,这很好用。
问题是,当我迁移我的模型时,我每次都必须设置 --database
参数,我发现这很烦人而且多余。还有很多次,我用迁移后的应用程序中的表淹没了我的默认数据库(通过忘记添加 --database
)。
我在我的路由器中尝试了 allow_migrate(...)
函数,但我所能实现的只是安全机制,如果我忘记指定数据库,该机制将不会运行迁移。
我的问题是:有没有办法在 Django 中为模型迁移设置自动数据库选择?
我的方法可能是错误的,令我惊讶的是以前似乎没有人这样做过。
最佳答案
对于遇到我遇到的问题的任何人,这是我最终解决的问题:
路由器.py:
from django.conf import settings
class DatabaseAppsRouter(object):
def db_for_read(self, model, **hints):
# your db routing
def db_for_write(self, model, **hints):
# your db routing
def allow_relation(self, obj1, obj2, **hints):
# your db routing
def allow_syncdb(self, db, model):
# your db routing
def allow_migrate(self, db, app_label, model_name=None, **hints):
if db in settings.DATABASE_APPS_MAPPING.values():
return settings.DATABASE_APPS_MAPPING.get(app_label) == db
elif app_label in settings.DATABASE_APPS_MAPPING:
return False
设置.py
DATABASE_ROUTERS = ['project.routers.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {'contenttypes': 'default',
'auth': 'default',
'admin': 'default',
'sessions': 'default',
'messages': 'default',
'staticfiles': 'default',
'myapp': 'mydb',
}
此设置让我可以运行两个命令:
python manage.py migrate
python manage.py migrate --database=mydb
这仍然是一对多,但至少现在我不能错误地将 myapp 迁移到我想承认的发生了更多次的默认数据库。
警告 - 咆哮:
到目前为止,我发现 Django 的设计很古怪,但非常合乎逻辑且对程序员友好,就像 Python 本身一样。但是迁移与多个数据库设置交互的方式确实很不方便,很容易让你的默认数据库充满不需要的表。 凯文在他的回答中链接的讨论表明,我不是唯一遇到这种困难的人。
关于python - 用于 django 中迁移的自动数据库路由器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39133559/