16

在我的 Django 项目中,我依赖于第三方应用程序,该应用程序在具有已知模式的各种目录中生成 SQLite 缓存文件。

我想使用 Django 模型来访问这些数据库,但显然我不能使用静态DATABASES设置。

如何在任意路径上动态打开 SQLite 数据库?

编辑

正如 Byron Ruth 指出的那样,解决方案是将 QuerySet 中django.db.connections的函数与函数结合使用。using

4

3 回答 3

33

这是在您的设置中定义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']
于 2013-01-21T16:06:09.207 回答
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

你可以,但你不应该。

于 2013-01-10T09:24:58.110 回答
1

假设使用的唯一引擎是 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
    }
}
于 2013-01-20T01:05:11.173 回答