我一直在评估django,并想知道以下是否可行。我已经查看了常规的多个数据库文档,所以请不要向我指出那些内容,因为我没有发现这种用例。如果我的说法有误,我会撤回它 :)
我想要一个主数据库,大多数应用程序模型将驻留在其中,但是其中一个应用程序需要动态创建数据库,这些将是特定于客户的数据库。
数据库路径(我打算使用sqlite)将存储在主数据库中,因此游标需要更改,但模型将保持不变。
我欢迎任何关于如何实现这一目标的想法?
我一直在评估django,并想知道以下是否可行。我已经查看了常规的多个数据库文档,所以请不要向我指出那些内容,因为我没有发现这种用例。如果我的说法有误,我会撤回它 :)
我想要一个主数据库,大多数应用程序模型将驻留在其中,但是其中一个应用程序需要动态创建数据库,这些将是特定于客户的数据库。
数据库路径(我打算使用sqlite)将存储在主数据库中,因此游标需要更改,但模型将保持不变。
我欢迎任何关于如何实现这一目标的想法?
from YOUR_PROJECT_NAME import settings
database_id = user.username #just something unique
newDatabase = {}
newDatabase["id"] = database_id
newDatabase['ENGINE'] = 'django.db.backends.sqlite3'
newDatabase['NAME'] = '/path/to/db_%s.sql' % database_id
newDatabase['USER'] = ''
newDatabase['PASSWORD'] = ''
newDatabase['HOST'] = ''
newDatabase['PORT'] = ''
settings.DATABASES[database_id] = newDatabase
save_db_settings_to_file(newDatabase) #this is for step 2)
save_db_settings_to_file
函数执行的。def save_db_settings_to_file(db_settings):
path_to_store_settings = "/path/to/your/project/YOUR_PROJECT_NAME/database_settings/"
newDbString = """
DATABASES['%(id)s'] = {
'ENGINE': '%(ENGINE)s', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': '%(NAME)s', # Or path to database file if using sqlite3.
'USER': '', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
""" % db_settings
file_to_store_settings = os.path.join(path_to_store_settings, db_settings['id'] + ".py")
write_file(file_to_store_settings, newDbString) #psuedocode for compactness
3) 为了在服务器启动时加载这些设置,我需要在 /path/to/your/project/YOUR_PROJECT_NAME/settings.py
的最底部添加一行代码,用于加载设置文件夹中的每个文件并运行它,从而实现将数据库详细信息加载到设置中。
import settings_manager
然后,import settings_manager
将会加载位于 /path/to/your/project/YOUR_PROJECT_NAME/settings_manager.py
的文件,该文件包含以下代码:
from settings import DATABASES
import os
path_to_store_settings = "/path/to/your/project/YOUR_PROJECT_NAME/database_settings/"
for fname in os.listdir(path_to_settings):
full_path = os.path.join(path_to_settings, fname)
f = open(full_path)
content = f.read()
f.close()
exec(content) #you'd better be sure that the file doesn't contain anything malicious
settings.DATABASES
可能不足够。更可靠的方法可能是编辑django.db.connections.databases
,它作为settings.DATABASES
的缓存和包装器。from django.db import connections
database_id = user.username #just something unique
newDatabase = {}
newDatabase["id"] = database_id
newDatabase['ENGINE'] = 'django.db.backends.sqlite3'
newDatabase['NAME'] = '/path/to/db_%s.sql' % database_id
newDatabase['USER'] = ''
newDatabase['PASSWORD'] = ''
newDatabase['HOST'] = ''
newDatabase['PORT'] = ''
connections.databases[database_id] = newDatabase
db_for_read
方法中添加 DB 创建逻辑,Django 将在每次从 DB 读取时创建新的数据库。db_for_write
同理。我只是想说所有功能都已经内置了。其他的东西取决于你的想象力。 - rzlvmpdb_for_read
和db_for_write
是用于数据库路由的方法,而不是用于创建数据库或数据库连接的方法。数据库连接
在设置文件中定义(硬编码),并且设置文件只会被加载一次。在您的所有链接中,数据库都在设置文件中定义,没有链接提到如何在运行时创建新的数据库连接
。新的数据库连接
应该以某种方式存储并在每次服务器重新启动时重新加载。 - Mu Sa新数据库连接应该以某种方式存储
→ 我认为最好的解决方案是创建硬编码连接DB来存储其他连接。并且db_for_read
内部的适当逻辑将允许这样做(如果连接仍不存在,则存储在DB中)。这比创建类似于“python”的文件并手动转义所有引号符等更灵活和可靠。 - rzlvmp