从数据库动态设置 Django 设置变量

Posted

技术标签:

【中文标题】从数据库动态设置 Django 设置变量【英文标题】:Dynamically set Django settings variables from Database 【发布时间】:2018-12-18 14:23:19 【问题描述】:

我目前正在尝试构建一个管理多个数据库的应用程序。由于该应用程序将管理 30 多个数据库中的数据,因此我试图在设置文件中生成 DATABASE_ROUTERS。我无法直接将 db 模型导入设置文件。我收到此错误:

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

这个错误是因为。有没有办法可以控制事件的顺序,以便在执行时建立所有设置之前访问数据库?我的目标是自动化数据库连接,从数据库中提取相关数据并在设置文件中生成 DATABASE_ROUTERS 和 DATABASES。这甚至可能吗?有没有我可以下载的包可以做到这一点?

如果您不知道我在问什么,请不要投反对票,请让我详细说明。

【问题讨论】:

不幸的是 django 设置在运行时是不可变的。我的下一个问题是在 django 数据库中保存 DATABASE 配置的数据库? 是的,配置将保存在应用程序的默认数据库中。 django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet. file init的可能重复 你可以看看我的回答,可能有兴趣,***.com/a/51082877/7692463 【参考方案1】:

我能够弄清楚如何从我的数据库中查询我需要的数据并将其导入到设置文件中。我在下面创建了脚本。请记住,这可以改进,这只是我从here 修改的内容。这直接从我的测试数据库(sqlite3)中查询数据。我在生产中使用 postgreSQL。这个脚本应该可以在 PostgreSQL 中使用,经过一些修改。

正如您在下面看到的,我将数据存储在字典中,然后将其存储在列表中。然后我将该字典列表导入到我的设置文件中。从那里我可以遍历列表并从数据库动态创建我的 DATABASE_ROUTERS 和 DATABASES。通过导入相同的列表,我还能够在我的 routers.py 文件中生成路由器类。如果您需要我进一步详细说明,请在下方评论。

import sqlite3
from sqlite3 import Error
dbs = []

def create_connection(db_file):
    """ create a database connection to the SQLite database
        specified by the db_file
    :param db_file: database file
    :return: Connection object or None
    """
    try:
        conn = sqlite3.connect(db_file)
        return conn
    except Error as e:
        print(e)

    return None


def select_all_data(conn):
    """
    Query all rows in the table
    :param conn: the Connection object
    :return:
    """
    cur = conn.cursor()
    cur.execute("SELECT * FROM fund_table")

    rows = cur.fetchall()

    for row in rows:
        print(row)


def select_name_and_db(conn):
    """
    Query table by fund_name and db_name
    :param conn: the Connection object
    :return:
    """
    cur = conn.cursor()
    cur.execute("SELECT fund_name, db_name FROM fund_table")

    rows = cur.fetchall()

    for row in rows:
        dbs.append("fund_name": row[0], "db_name": row[1])
    return dbs


def main():
    database = "edb.sqlite3"

    # create a database connection
    conn = create_connection(database)
    with conn:

        """ select_all_data(conn) """
        select_name_and_db(conn)

main()

【讨论】:

谢谢。这个技巧对我帮助很大。【参考方案2】:

创建一个函数来加载这个变量并使其异步,所以在你的应用准备好之后你加载它,但我不确定这是否会正常工作

https://hackernoon.com/asynchronous-python-45df84b82434

Dirty Sollution 是为每个 BD 制作 1 个文件,您可以根据 BD 的工作方式调用您的设置...

【讨论】:

我会试试这个并回复你。谢谢。

以上是关于从数据库动态设置 Django 设置变量的主要内容,如果未能解决你的问题,请参考以下文章

Django Rest Framework:从 URL 参数动态设置数据库

Django 设置:如何从应用程序的设置文件夹中访问变量

django模型,如何动态设置查询的字段?

Django + mod_wsgi。从 Apache 的 SetEnv 设置操作系统环境变量

动态命名apple脚本变量

使用 AJAX 设置时未保存 Django 会话变量