Django的数据库层可否在Django之外使用?

91

我在Django中创建了一个很好的数据库,想通过一些Python脚本与其进行交互,而不是通过我的网站。我想知道是否可以在Django站点外部使用Django数据库API,并且如果可以,是否有人了解如何实现?谷歌没有给出很多有用的结果。

12个回答

83

在进行任何调用之前,包括导入您的模型,您只需要配置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。


我有一个连接器(package)可以连接到Hive数据库,我能够在Python程序中导入它并从Hive数据库中获取数据。我应该把这个连接器放在哪里?也就是说,我该把它放在哪个文件夹中,并将我的DATABASE_ENGINE命名为什么?提前致谢。 - Thirumalreddy_Bandi
我们需要添加哪些库到 requirements.txt 中才能得到这个? - Pratik Khadloya
1
我遇到了一个错误,我在这里记录了https://dev59.com/Fanka4cB1Zd3GeqPNWbL - Pratik Khadloya
只导入已经存在于项目中的settings.py文件,这样就足够了吧? - Daniel W.

19

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

11

更新:在Django 1.6中将删除setup_environ。

如果您能够导入settings.py文件,则可以查看方便的setup_environ命令,请参考此处

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
弃用!setup_environ,我会想念你的。 - B Robster
请看我的后续问题以了解替代方案:https://dev59.com/EWUp5IYBdhLWcg3wx5xu - B Robster

11

我在寻找有关Django 3.0的答案,但以上方法都并没有完全适用于我。

我阅读了官方文档https://docs.djangoproject.com/en/3.0/topics/settings/,这些脚本对我起到了作用。

项目结构

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

db_tasks.py:

import os
import django

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

from polls.models import Question

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

这个帮了我很多。但是我认为作者的环境设置有误:应该是'mysite.settings'而不是'dashboard.settings'。 - wr200m
我的项目名称是“仪表板”。你可以选择任何你想要的项目名称。 - Rahul
在我的端上似乎不起作用。当我运行 python db_task.py 时,我收到了一个错误消息 ModuleNotFoundError: No module named 'project_name'。还有其他的输入吗? - codecumber

9

这是我使用的代码。只需将your_project替换为您的Django项目名称,将yourApp替换为您的Django应用程序名称,将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”替换为您要在models文件中使用的模型,而“any_fild”则是您要从数据库中获取的字段。 - Mahdi Heidari kia

9
一个未被提及的最终选择是:自定义./manage.py子命令。详情请参考自定义管理命令

1
我认为这是正确的做法,仅代表我的个人观点。 - Thibault J
1
更新文档链接:https://docs.djangoproject.com/en/dev/howto/custom-management-commands/ - Gary

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

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中使用数据库文件的完整路径:

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

作为一个不太正规的替代方法来正确设置环境变量,你可以在导入应用程序模块之前在顶部加上os.environ['DJANGO_SETTINGS_MODULE']=dproj.settings。这只会在该进程的持续时间内更改DJANGO_SETTINGS_MODULE。 - twneale
这是一个非常好的方法,与接受的答案相比,它不会复制设置。此外,如果Django设置已经包含了SQLite文件的绝对路径,而这在当前Django版本中是成立的,则步骤3就不再需要了。使其成为最简洁的解决方案。 - Ad N

3

对于支持多数据库的Django 1.5+版本,DATABASE设置也有所变化。你需要根据以下方式进行调整...

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

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文件应与项目中的其他应用程序一起。否则会出现一堆错误。 - Gru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接