【问题标题】:How to dynamically initialize DATABASE_APPS_MAPPING in django如何在 django 中动态初始化 DATABASE_APPS_MAPPING
【发布时间】:2016-06-15 00:59:47
【问题描述】:

我有一种情况需要我使用数据库列表。每个租户一个数据库。此信息保存在默认数据库中。因此,我的DATABASE_APPS_MAPPING 目前已使用我从默认数据库手动获取的数据库列表进行硬编码,并将其保存在settings.py 文件中。

但是每次我们升级服务时,我都需要手动将数据库值复制到DATABASE_APPS_MAPPING。这变得很痛苦,我想在 django 初始化时使用代码构建这个集合。也许有一个模块dbinit.py

list_of_db=[]

def initialize(defaultDbName):
   #Build up list_of_db

然后在settings.py,我可以这样做:-

import dbinit
.
.
.
DATABASE_APPS_MAPPING=dbinit.list_of_db

我的具体问题是我在哪里打电话 dbinit.initialize() ?那是urls.pywsgi.py。谢谢。

【问题讨论】:

标签: python django django-database


【解决方案1】:

我相信我在这里找到了答案。花了几天时间参考其他堆栈溢出查询。

dbinit.py的代码应该是这样的:-

list_of_db=[]
initialized=False

def initialize(defaultDbName):
    if not initialized:
        build_up_list(list_of_db,defaultDbName)#Build the list.

initialize("mydefaultDbContainingInfoOnOtherDBs")

由于 python 解释器的任何导入都是在持有导入锁的同时执行的,因此我们确信只有一个线程将执行上述模块的 initialize 方法中的代码。因此,即使上述模块在不同线程的执行上下文中多次导入,我们也可以确保初始化只发生了一次。

【讨论】:

    猜你喜欢
    • 2015-05-06
    • 2016-01-04
    • 2011-01-03
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 2019-10-30
    相关资源
    最近更新 更多