在我的Django项目中,我依赖于第三方应用程序,该应用程序使用已知模式在各种目录中生成SQLite缓存文件。
我想使用Django模型访问这些数据库,但显然我不能使用静态DATABASES
设置。
如何在任意路径上动态打开SQLite数据库?
修改
正如Byron Ruth指出的那样,解决方案是将django.db.connections
与using
函数结合使用在QuerySet中。
答案 0 :(得分:30)
django.db.connections
是您设置中定义的DATABASES
周围的简单包装器。包装类在这里:
django.db.utils#L137-L227
from django.db import connections
# Add connection information dynamically..
connections.databases['new-alias'] = { ... }
# Ensure the remaining default connection information is defined.
# EDIT: this is actually performed for you in the wrapper class __getitem__
# method.. although it may be good to do it when being initially setup to
# prevent runtime errors later.
# connections.databases.ensure_defaults('new-alias')
# Use the new connection
conn = connections['new-alias']
答案 1 :(得分:4)
您可以在DATABASES设置中注册数据库。
from your_project import settings
database_id = "unqique_name"
new_database = {}
new_database["id"] = database_id
new_database['ENGINE'] = 'django.db.backends.sqlite3'
new_database['NAME'] = '/project/data/db_%s.sql' % database_id
new_database['USER'] = ''
new_database['PASSWORD'] = ''
new_database['HOST'] = ''
new_database['PORT'] = ''
settings.DATABASES[database_id] = new_database
你可以,但你不应该。
答案 2 :(得分:2)
假设使用的唯一引擎是SQLite,并且(仅)数据库文件的位置有所不同,请为NAME
提供可调用的内容:
def get_db_loc():
# code to determine filesystem location of database
return location
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': get_db_loc(),
# More config goes here
}
}