从数据库动态设置 Django 设置变量
Dynamically set Django settings variables from Database
我目前正在尝试构建一个管理多个数据库的应用程序。由于该应用程序将管理 30 多个数据库中的数据,因此我试图在设置文件中生成 DATABASE_ROUTERS。我无法直接将数据库模型导入设置文件。我收到此错误:
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
此错误自。有没有一种方法可以控制事件的顺序,以便在执行所有设置之前我可以访问数据库?我的目标是自动化数据库连接,从数据库中提取相关数据并在设置文件中生成 DATABASE_ROUTERS 和 DATABASES。这可能吗?是否有一个我可以下载的包可以做到这一点?
如果您不知道我在问什么,请不要投反对票,请我详细说明。
制作一个加载此变量的函数并使其异步,因此在您的应用准备就绪后加载它,但我不确定这是否会正常工作
https://hackernoon.com/asynchronous-python-45df84b82434
Dirty Sollution 为每个 BD 制作 1 个文件,您根据 BD 的工作方式调用您的设置...
我能够弄清楚如何从我的数据库中查询我需要的数据并将其导入到设置文件中。我创建了下面的脚本。请记住,这可以改进,这只是我从 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()
我目前正在尝试构建一个管理多个数据库的应用程序。由于该应用程序将管理 30 多个数据库中的数据,因此我试图在设置文件中生成 DATABASE_ROUTERS。我无法直接将数据库模型导入设置文件。我收到此错误:
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
此错误自。有没有一种方法可以控制事件的顺序,以便在执行所有设置之前我可以访问数据库?我的目标是自动化数据库连接,从数据库中提取相关数据并在设置文件中生成 DATABASE_ROUTERS 和 DATABASES。这可能吗?是否有一个我可以下载的包可以做到这一点?
如果您不知道我在问什么,请不要投反对票,请我详细说明。
制作一个加载此变量的函数并使其异步,因此在您的应用准备就绪后加载它,但我不确定这是否会正常工作
https://hackernoon.com/asynchronous-python-45df84b82434
Dirty Sollution 为每个 BD 制作 1 个文件,您根据 BD 的工作方式调用您的设置...
我能够弄清楚如何从我的数据库中查询我需要的数据并将其导入到设置文件中。我创建了下面的脚本。请记住,这可以改进,这只是我从 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()