Verwenden Sie die Django-Datenbankebene außerhalb von Django?

73

Ich habe eine schöne Datenbank, die ich in Django erstellt habe, und ich möchte über einige Python-Skripte außerhalb meiner Website eine Schnittstelle herstellen. Daher bin ich gespannt, ob es möglich ist, die Django-Datenbank-API außerhalb eines Django zu verwenden Website, und wenn ja, hat jemand Informationen darüber, wie es gemacht werden kann? Google hat dafür nicht viele Treffer erzielt.

gct
quelle

Antworten:

71

Sie müssen nur die Django-Einstellungen konfigurieren, bevor Sie Anrufe tätigen, einschließlich des Imports Ihrer Modelle. Etwas wie das:

from django.conf import settings
settings.configure(
    DATABASE_ENGINE = 'postgresql_psycopg2',
    DATABASE_NAME = 'db_name',
    DATABASE_USER = 'db_user',
    DATABASE_PASSWORD = 'db_pass',
    DATABASE_HOST = 'localhost',
    DATABASE_PORT = '5432',
    TIME_ZONE = 'America/New_York',
)

Stellen Sie erneut sicher, dass Sie diesen Code ausführen, bevor Sie ihn ausführen, z.

from your_app.models import *

Verwenden Sie dann einfach die DB-API wie gewohnt.

FogleBird
quelle
Ich habe einen Connector (Paket), um eine Verbindung zur Hive-Datenbank herzustellen, und ich kann ihn in ein Python-Programm importieren und die Daten aus der Hive-Datenbank abrufen. Wo platziere ich diesen Connector, dh in welchem ​​Ordner platziere ich und wie benenne ich meine DATABASE_ENGINE? Danke im Voraus.
Thirumalreddy_Bandi
Welche Bibliotheken müssen wir zur Anforderung.txt hinzufügen, um dies zu erhalten?
Pratik Khadloya
1
Ich stoße
Wäre es nicht genug, nur das settings.pymit all dem zu importieren , was bereits im Projekt vorhanden ist?
Daniel W.
15

Für Django 1.7 habe ich Folgendes verwendet, um den Betrieb aufzunehmen.

settings.py:

from django.conf import settings
settings.configure(
    DATABASES={
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'name',
            'USER': 'usr',
            'PASSWORD': 'secret',
            'HOST': '127.0.0.1',
            'PORT': '5432',
        },
    },
    TIME_ZONE='America/Montreal',
)

In der Datei, die die Startroutine enthält

import os
import django

import v10consolidator.settings
from myapp.models import *

os.environ.setdefault(
    "DJANGO_SETTINGS_MODULE",
    "myapp.settings"
)
django.setup()
Gab
quelle
12

Das Update setup_environ soll in django 1.6 entfernt werden

Wenn Sie in der Lage sind , Ihre settings.py - Datei zu importieren, dann werfen Sie einen Blick auf praktisch setup_environ Befehl.

from django.core.management import setup_environ
from mysite import settings

setup_environ(settings)

#here you can do everything you could in your project
Dmitry Shevchenko
quelle
3
Veraltet! setup_environ, ich werde dich vermissen
B Robster
Siehe meine Folgefrage für Alternativen: stackoverflow.com/questions/15048963/…
B Robster
6

Hier ist der Code, den ich benutze. Ersetzen your_projectSie einfach durch Ihren Django-Projektnamen, yourAppdurch Ihren Django-App-Namen, any_modeldurch das Modell, das Sie in der Modelldatei verwenden möchten, und any_filddurch das Feld, das Sie aus der Datenbank erhalten möchten:

from django.conf import settings
import django

from your_project.settings import DATABASES, INSTALLED_APPS
settings.configure(DATABASES=DATABASES, INSTALLED_APPS=INSTALLED_APPS)
django.setup()

from yourApp.models import *
print(any_model.objects.all()[0].any_fild)
Mahdi Heidari kia
quelle
Ersetzen Sie einfach "your_project" durch Ihren Django-Projektnamen, "yourApp" durch Ihren Django-App-Namen, "any_model" durch das Modell, das Sie in der Modelldatei verwenden möchten, und "any_fild" durch ein Feld, das Sie aus der Datenbank erhalten möchten
Mahdi Heidari kia
4

Ich suchte nach Antworten für Django 3.0 und keine der oben genannten Methoden funktionierte genau für mich.

Ich habe die offiziellen Dokumente unter https://docs.djangoproject.com/de/3.0/topics/settings/ gelesen und diese Skripte haben für mich funktioniert.

Mein Skript db_tasks.py befindet sich so auf meiner Site.

mysite
    mysite
    db.sqlite3
    db_tasks.py
    manage.py
    polls

db_tasks.py

import os
import django

os.environ['DJANGO_SETTINGS_MODULE'] = 'dashboard.settings'
django.setup()

from polls.models import Question

print(Question.objects.all())
out: <QuerySet [<Question: WTU?]>
Rahul
quelle
3

Für die Verwendung von Django ORM aus anderen Anwendungen benötigen Sie:

1) export DJANGO_SETTINGS_MODULE=dproj.settings

2) Fügen Sie Ihren Django-App-Ordner zum Pfad hinzu (Sie können dies im Code Ihrer Nicht-Django-App tun):

sys.path = sys.path + ['/path/to/your/app/']

3) Wenn Sie SQLite verwenden, verwenden Sie den vollständigen Pfad zur Datenbankdatei in settings.py:

DATABASE_NAME = '/path/to/your/app/base.db'
Juanjo Conti
quelle
Als hackige Alternative zum korrekten Festlegen der Umgebungsvariablen können Sie vor dem Importieren Ihrer Anwendungsmodule os.environ ['DJANGO_SETTINGS_MODULE'] = dproj.settings an die Spitze setzen. Dadurch wird DJANGO_SETTINGS_MODULE nur für die Dauer dieses Prozesses geändert.
Twneale
Dies ist ein sehr guter Ansatz, bei dem die Einstellungen nicht im Gegensatz zur akzeptierten Antwort dupliziert werden. Wenn die Django-Einstellungen bereits den absoluten Pfad zur SQLite-Datei enthalten, was bei aktuellen Django-Versionen der Fall ist , ist Schritt 3 nicht mehr erforderlich . Damit ist es die kompakteste Lösung.
Ad N
3

Für Django 1.5 on (mehrere Datenbanken werden unterstützt) wurden auch die DATABASE-Einstellungen geändert. Sie müssen die vorherige Antwort anpassen, um ...

settings.configure(
    DATABASES = { 'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'db_name',
        'USER': 'db_usr',
        'PASSWORD': 'db_pass',
        'HOST': '',
        'PORT': '',
        }, },
    TIME_ZONE = 'Europe/Luxembourg'
)
G. Schutz
quelle
3
import os, sys

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings")
sys.path.append(os.path.abspath(os.path.join(BASE_DIR, os.pardir)))

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

from app.models import MyModel
Shankypy
quelle
arbeitet an Django 3.0, danke Mann.
Ruxtain
2

Basierend auf der Antwort von Hai Hu ist hier ein Arbeitsskript, das auf Django 1.10 und 1.11 getestet wurde. Ich importiere zuerst die Basis-Apps von Django, weil sie in vielen anderen Apps benötigt werden.

import os
from django.conf import settings
from django.apps import apps

conf = {
    'INSTALLED_APPS': [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.messages',
        'django.contrib.sessions',
        'django.contrib.sitemaps',
        'django.contrib.sites',
        'django.contrib.staticfiles',
        '<your_app>',
    ],
    'DATABASES': {
        'default': {
            'ENGINE': os.environ.get('DB_ENGINE'),
            'NAME': os.environ.get('DB_NAME'),
            'USER': os.environ.get('DB_USER'),
            'PASSWORD': os.environ.get('DB_PASSWORD'),
            'HOST': os.environ.get('DB_HOST'),
            'PORT': os.environ.get('DB_PORT'),
        }
    },
    'TIME_ZONE': 'UTC'
}

settings.configure(**conf)
apps.populate(settings.INSTALLED_APPS)

<import your app models here>
Rani
quelle
Ihre Lösung funktioniert. Hinweis: Die Python-Datei, in die Sie diesen Code einfügen, sollte sich neben anderen Apps Ihres Projekts befinden. Sonst würde es durch eine Reihe von Fehlern.
100rabh