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.

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.


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


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()

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

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)

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?]>

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'

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'
)

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

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>

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.