在Django之外使用Django数据库层?


73

我已经在Django中创建了一个不错的数据库,并且希望通过网站内容之外的一些python脚本进行交互,因此我很好奇是否可以在Django之外使用Django数据库API网站,如果有的话,有没有人知道如何做?Google并没有为此带来很多成功。

Answers:


71

在进行任何调用(包括导入模型)之前,您只需要配置Django设置即可。像这样:

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

同样,请确保在运行之前运行该代码,例如:

from your_app.models import *

然后,只需照常使用DB API。


我有一个连接器(包)可以连接到Hive数据库,并且能够将其导入python程序并从Hive数据库中获取数据。我应该在哪里放置该连接器,即我应该放置在哪个文件夹中,以及我该如何命名DATABASE_ENGINE?提前致谢。
Thirumalreddy_Bandi

我们需要将哪些库添加到requirements.txt来实现?
Pratik Khadloya

1
正在运行到我所记录在这里的错误stackoverflow.com/questions/49015994/...
PRATIK Khadloya

settings.py使用项目中已经存在的所有内容导入,这还不够吗?
Daniel W.19年

15

对于django 1.7,我使用以下代码来启动和运行。

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

在包含启动例程的文件中

import os
import django

import v10consolidator.settings
from myapp.models import *

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



6

这是我使用的代码。只需替换your_project为Django项目名称,yourAppDjango应用名称,any_model要在models文件中使用的模型以及any_fild要从数据库中获取的字段即可:

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)

只需将“ your_project”替换为django项目名称,将“ yourApp”替换为django应用程序名称,将“ any_model”替换为要在模型文件中使用的模型,将“ any_fild”替换为要从数据库中获取的字段
Mahdi Heidari kia

4

我一直在寻找django 3.0的答案,以上方法都不适合我。

我在https://docs.djangoproject.com/en/3.0/topics/settings/上阅读了官方文档,并且此脚本对我有用。

我的脚本db_tasks.py像这样在mysite内部。

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

要从其他应用程序使用Django ORM,您需要:

1) export DJANGO_SETTINGS_MODULE=dproj.settings

2)将您的Django应用文件夹添加到路径(您可以在非django应用的代码中完成此操作):

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

3)如果使用SQLite,请使用settings.py中db文件的完整路径:

DATABASE_NAME = '/path/to/your/app/base.db'

作为适当设置环境变量的一种替代方法,可以在导入应用程序模块之前将os.environ ['DJANGO_SETTINGS_MODULE'] = dproj.settings放在顶部。在此过程中,只会更改DJANGO_SETTINGS_MODULE。
twneale 2010年

这是一种非常好的方法,不会重复设置,而不是接受答案。另外,如果Django设置已经包含SQLite文件的绝对路径(当前Django版本就是这种情况),则不再需要第3步。使其成为最紧凑的解决方案。
广告N

3

对于django 1.5 on(支持多个数据库),数据库设置也已更改。您需要调整以前的答案以...

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

2

根据Hai Hu的回答,这是一个工作脚本,已在Django 1.10和1.11上进行了测试。我首先导入Django的基本应用程序,因为许多其他应用程序都需要它们。

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>

您的解决方案有效。注意:您将在其中粘贴此代码的python文件应与项目的其他应用程序一起放置。否则,它将经历很多错误。
100rabh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.