我一直在评估django,并想知道以下情况是否可能。我已经看过常规的多个数据库文档,所以请不要指向我,因为据我所知,并没有提到该用例。如果我错了,我把它拿回来:)
我想要一个主数据库,我的大多数应用程序模型都将驻留在其中,但是该应用程序之一将需要动态创建数据库,这些数据库将是客户特定的数据库。
数据库路径(我计划使用sqlite)将存储在主数据库中,因此需要更改游标,但模型将保持不变。
我欢迎任何有关实现此目标的想法?
话虽如此,我也有同样的问题,我想为每个用户创建一个唯一的数据库。这样做的原因是,我为用户提供了一种功能,使其可以保存/访问未存储在服务器上的数据库,这需要具有多个数据库,因此每个用户一个。
建议不要使用此答案来达到期望的目标。我很想听听django-guru的意见,介绍如何最好地解决这个问题。但是,这是我一直在使用的一种解决方案,到目前为止效果很好。我正在使用sqlite,但是可以轻松地对任何数据库进行修改。
总之,这是过程:
1)首先,在创建新用户时,我在设置中创建了一个新数据库。这段代码在我看来是创建新用户的地方。
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)
该脚本将“运行时”数据库设置加载到django项目设置中。但是,如果重新启动服务器,则该数据库将不再处于设置中。
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每个文件加载到settings文件夹中并运行它,从而将数据库详细信息加载到设置中。
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.py的底部而不是import语句的底部,但是使用import语句可以使settings.py的抽象级别保持一致。
这是一种加载每个数据库设置的便捷方法,因为要从设置中删除数据库,你要做的就是删除设置文件,并且下次服务器重新启动时,它不会将这些详细信息加载到设置中,并且数据库将无法访问。
就像我说的那样,这种方法行之有效,到目前为止,我已经成功使用了它,但这并不是理想的解决方案。如果有人可以发布更好的解决方案,我将不胜感激。
有什么不好的地方:
问题内容: 在我的Django项目中,我对第三方应用程序具有依赖性,该第三方应用程序在具有已知模式的各个目录中生成SQLite缓存文件。 我想使用Django模型来访问这些数据库,但是显然我不能使用静态DATABASES设置。 如何在任意路径上动态打开SQLite数据库? 编辑 正如Byron Ruth所指出的,解决方案是将django.db.connections结合使用usingQuerySe
问题内容: 我有两个数据库和两个模型:管理员和用户。 我想将我的模型同步到两个数据库;admin模型到数据库A,用户模型到数据库B; 如果我将模型路径设置为和,则两个模型将同步到默认数据库。 如果我在命令中设置数据库,例如,则两个模型将同步到数据库B。 所以我的问题是,如何将两个模型同步到两个数据库? 问题答案: 我完全同意@alecxe使用数据库路由器。我目前正在使用一个管理界面来管理多个数据库
我有两个数据库和两个模型:管理员和用户。 我想将我的模型同步到两个数据库;管理模型到数据库A,用户模型到数据库B; 如果我将模型路径设置为和,这两个模型将同步到默认数据库。 如果我在命令中设置数据库,比如,那么这两个模型将同步到数据库B。 所以我的问题是,如何将这两个模型同步到两个数据库?
问题内容: 我正在尝试将Django多数据库配置与MYSQL用作默认数据库,将redshift用作分析数据库。我的配置看起来像这样: 当我尝试迁移分析应用程序时,请使用以下命令 我看到以下错误: 关于如何解决此问题的任何想法?我正在使用和 问题答案: 特定的问题是:Django想要创建一个具有主键的迁移管理表来跟踪迁移历史。Redshift不支持。 但是,这种方法更普遍的问题是,您真的不希望在Re
我正在构建一个需要连接2个数据库的应用程序。第一个是静态的,另一个是动态的。config/database.php类似于 模型代码就像 如果我提供静态连接详细信息,我可以连接多个数据库,但如果我提供动态连接详细信息,如 或 动态连接多个数据库而不影响应用程序性能的最佳方法是什么?
问题内容: 我一直在使用手动数据库选择来处理具有两个独立数据库的项目。我已经在设置中定义了数据库。 进一步阅读之后,看来数据库路由实际上是解决问题的方法。但是,在阅读了文档和此处的一些相关文章之后,我比以往更加困惑。 在我的设置中,我有: 我知道我必须像这样定义路由器类(我认为在文件中): 那呢 每个模型都需要一个还是自动的?除此之外,我仍然得到一个错误: django.core.exceptio