/ / Django: dynamische Datenbankdatei - Django, Django-Modelle, Django-Datenbank

Django: dynamische Datenbankdatei - django, django-models, django-database

In meinem Django-Projekt habe ich eine Abhängigkeit für eine Drittanbieteranwendung, die SQLite-Cache-Dateien in verschiedenen Verzeichnissen mit einem bekannten Schema erzeugt.

Ich möchte Django-Modelle für den Zugriff auf diese Datenbanken verwenden, aber offensichtlich kann ich keine Statik verwenden DATABASES Konfiguration.

Wie kann ich eine SQLite-Datenbank auf einem beliebigen Pfad dynamisch öffnen?

BEARBEITEN

Wie Byron Ruth darauf hinwies, ist die Lösung die Verwendung der django.db.connections In Verbindung mit using Funktion im QuerySet.

Antworten:

29 für die Antwort № 1

Das django.db.connections ist eine einfache Hülle DATABASES in Ihren Einstellungen definiert. Die Wrapper-Klasse ist hier: 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"]

4 für die Antwort № 2

Sie können die Datenbank in den DATENBANKEN-Einstellungen registrieren.

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

Sie können, aber Sie sollten nicht.


2 für die Antwort № 3

Angenommen, die einzige Engine, die verwendet wird, ist SQLite und der Speicherort der (einzigen) Datenbankdatei ist unterschiedlich 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
}
}