Подтвердить что ты не робот

Django: динамический файл базы данных

В моем проекте Django у меня есть зависимость для стороннего приложения, которое создает файлы кэша SQLite в разных каталогах с известной схемой.

Я хотел бы использовать модели Django для доступа к этим базам данных, но, очевидно, я не могу использовать статическую установку DATABASES.

Как я могу динамически открывать базу данных SQLite на любом пути?

ИЗМЕНИТЬ

Как отметил Байрон Рут, решение заключается в использовании django.db.connections в сочетании с функцией using в QuerySet.

4b9b3361

Ответ 1

django.db.connections - это простая оболочка вокруг DATABASES, определенная в ваших настройках. Класс wrapper находится здесь: 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']

Ответ 2

Вы можете зарегистрировать базу данных в настройках 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

Вы можете, но не должны.

Ответ 3

Предполагая, что единственным используемым движком является 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
    }
}