在我的 Django 项目中,我依赖于第三方应用程序,该应用程序在具有已知模式的各种目录中生成 SQLite 缓存文件。
我想使用 Django 模型来访问这些数据库,但显然我不能使用静态DATABASES
设置。
如何在任意路径上动态打开 SQLite 数据库?
编辑
正如 Byron Ruth 指出的那样,解决方案是将 QuerySet 中django.db.connections
的函数与函数结合使用。using
在我的 Django 项目中,我依赖于第三方应用程序,该应用程序在具有已知模式的各种目录中生成 SQLite 缓存文件。
我想使用 Django 模型来访问这些数据库,但显然我不能使用静态DATABASES
设置。
如何在任意路径上动态打开 SQLite 数据库?
编辑
正如 Byron Ruth 指出的那样,解决方案是将 QuerySet 中django.db.connections
的函数与函数结合使用。using
这是在您的设置中定义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']
您可以在 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
你可以,但你不应该。
假设使用的唯一引擎是 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
}
}