5

我正在使用一个涉及多个数据库的 django 应用程序 - 即动态添加多个数据库。每当有新客户注册时,我们都会为他们提供一个新数据库。设置文件可以动态加载这些(例如,我在服务器上运行一个 shell 脚本,它会在不更改任何代码的情况下更新数据库定义 - 如果你真的很好奇,请给我发消息),但是由于 uwsgi/django 缓存了设置,我必须碰撞 uwsgi 才能让新数据库被识别。

关于强制 django 重新加载设置或使其设置缓存无效的任何建议?它可以来自命令行等。目前我正在使用 import settings 而不是来自,django.conf import settings因为这在过去是半工作的,但我可以轻松切换回来。

谢谢!

ps - 如果答案是“你这个笨蛋,不要使用动态多数据库”,那也没关系;)

4

1 回答 1

1

首先。如果您可以从多个数据库中辞职,那么只有在数据库列表固定时,Django 才能很好地支持这一点。如果您可以为每个客户端提供单独的数据库,您可能可以为不同的客户端提供单独的 wsgi 进程(和单独的 DATABASES 设置)。然后,您只需为新客户端生成新的 wsgi 进程,而不必修改设置。

如果你仍然想做你计划的事情,这里有一些提示:

动态重新加载设置不是一种选择。那里有很多问题。即使您与所有这些都作斗争,它们也可能会在您意想不到的时候回来,并且您将花费数小时(如果不是数天)进行调试。

如果您的数据库设置是一致的(即所有客户端的密码和用户相同),您可以考虑对 DATABASES 变量使用 defaultdict。默认字典有工厂选项。你可以在工厂里有这样的东西:

def database_configuration_factory(name):
    # check if database exists (ie. raw SQL)

    return {
        'NAME': name,
        ...
    }
于 2012-06-10T14:05:25.193 回答