Используя только часть БД Django - PullRequest
40 голосов
/ 24 февраля 2009

Кто-нибудь знает, насколько "модульным" является Django? Могу ли я использовать только часть ORM, чтобы получить классы, которые сопоставляются с таблицами БД, и знать, как читать / писать из этих таблиц?

Если нет, то что бы вы порекомендовали как "Python-эквивалент Hibernate"?

Ответы [ 14 ]

89 голосов
/ 25 февраля 2009

Если вам нравится ORM от Django, использовать его «автономно» совершенно просто; Я написал несколько методов для использования частей Django вне веб-контекста , и вы можете использовать любой из них (или свернуть свой собственный).

Шейн выше, кажется, немного дезинформирован об этом и некоторых других моментах - например, Django может делать несколько разных баз данных, он просто не по умолчанию к этому (вам нужно создать собственный менеджер для моделей, которые используют что-то отличное от «основной» БД, что-то не очень сложное, и есть рецепты для этого). Это правда, что сам Django не выполняет управление соединением / пул соединений, но лично я всегда использовал для этого внешние инструменты (например, pgpool, который работает сложнее, чем что-либо, встроенное в ORM).

Я бы посоветовал потратить некоторое время на чтение и, возможно, попробовать несколько вероятных поисков в Google (например, публикация, на которую я ссылался, является лучшим результатом для "автономного скрипта Django"), чтобы понять, что на самом деле будет наилучшим образом соответствует вашим потребностям и вкусам - возможно, ORM от Django не подходит вам, и вы не должны использовать его, если это не так, но, к сожалению, существует много дезинформации, которая мутит воду.

Редактирование для ответа Шейну:

Опять же, вы, похоже, неверно проинформированы: необходимо настроить SQLAlchemy (т. Е. Указать, какую БД использовать, как подключиться и т. Д.), Прежде чем вы сможете выполнять запросы с ней, так как же тот факт, что Django нуждается в аналогичной конфигурации (достигается с помощью выбранного вами метода - вам не нужно иметь полный файл настроек Django) какой-либо недостаток?

Что касается поддержки нескольких БД, вы, кажется, запутались: поддержка там на низком уровне. Объект запроса - не QuerySet, но базовый объект Query, который он будет выполнять, знает, к какой БД он подключается, и принимает подключение к БД в качестве одного из аргументов инициализации. Настроить одну модель на использование одной БД, а другую - использовать другую, так же просто, как настроить один метод на менеджере, который передает правильную информацию о соединении в Query. Правда, для этого не существует высокоуровневого API, но это не то же самое, что «отсутствие поддержки» и не то же самое, что «требуется пользовательский код» (если только вы не утверждаете, что настройка нескольких БД явно в SQLAlchemy требуется, если вы хотите несколько БД, это тоже "пользовательский код").

Что касается того, что вы в итоге косвенно используете вещи, которых нет в django.db, ну и что с того? То, что django.db импортирует биты, скажем, django.utils, потому что есть структуры данных и другие биты кода, которые полезны не только для ORM, прекрасно, насколько я лично обеспокоен; с таким же успехом можно жаловаться, если что-то имеет внешние зависимости или использует стандартные библиотеки Python вместо того, чтобы быть на 100% автономным.

12 голосов
/ 24 февраля 2009

Короткий ответ: нет, вы не можете использовать Django ORM отдельно от Django.

Длинный ответ таков: да, вы можете, если хотите загружать большие части Django вместе с ним. Например, соединение с базой данных, используемое Django, открывается, когда происходит запрос к Django. Это происходит при отправке сигнала, чтобы вы могли якобы отправить этот сигнал, чтобы открыть соединение, не используя специальный механизм запроса. Также вам необходимо настроить различные приложения и настройки для проекта Django.

В конечном счете, это, вероятно, не стоит вашего времени. SQL Alchemy - это относительно хорошо известный Python ORM, который на самом деле более мощный, чем Django, так как он поддерживает несколько соединений с базой данных, пул соединений и другие полезные вещи.


Редактировать: в ответ на критику Джеймса в другом месте, я поясню, что я описал в моем первоначальном посте. Хотя отрадно, что меня вызвал крупный автор Django, я все же думаю, что я прав:)

Прежде всего, подумайте, что нужно сделать, чтобы использовать ORM Джанго отдельно от любой другой части. Вы используете один из методов , описанных Джеймсом, для выполнения базовой настройки Django. Но некоторые из этих методов не позволяют использовать команду syncdb, которая требуется для создания таблиц для ваших моделей. Для этого необходим файл settings.py с переменными не только для DATABASE_*, но и INSTALLED_APPLICATIONS с правильными путями ко всем файлам models.py.

Можно использовать собственное решение для использования syncdb без файла settings.py, но для этого требуются некоторые дополнительные знания Django. Конечно, вам не нужно использовать syncdb; таблицы могут быть созданы независимо от моделей. Но это аспект ORM, который недоступен, пока вы не приложите некоторые усилия к настройке.

Во-вторых, подумайте, как вы будете создавать свои запросы к БД с помощью стандартного вызова Model.objects.filter(). Если это сделано как часть представления, это очень просто: создайте QuerySet и просмотрите экземпляры. Например:

tag_query = Tag.objects.filter( name='stackoverflow' )
if( tag_query.count() > 0 ):
    tag = tag_query[0]
    tag.name = 'stackoverflowed'
    tag.save()

Красиво, просто и чисто. Теперь без поддержки системы цепочки запросов / ответов Django вам нужно инициализировать соединение с базой данных, выполнить запрос, а затем закрыть соединение. Таким образом, приведенный выше пример становится:

from django.db import reset_queries, close_connection, _rollback_on_exception
reset_queries()
try:
    tag_query = Tag.objects.filter( name='stackoverflow' )
    if( tag_query.count() > 0 ):
        tag = tag_query[0]
        tag.name = 'stackoverflowed'
        tag.save()
except:
    _rollback_on_exception()
finally:
    close_connection()

Управление подключением к базе данных также может осуществляться через сигналы Django. Все вышеперечисленное определено в django / db / init .py . Другие ORM также имеют такого рода управление соединениями, но вам не нужно копаться в их источнике, чтобы узнать, как это сделать. Система управления соединениями в SQL Alchemy описана в руководствах и других.

Наконец, вам нужно помнить, что объект подключения к базе данных всегда является локальным по отношению к текущему потоку, что может ограничивать или не ограничивать вас в зависимости от ваших требований. Если ваше приложение не имеет состояния, например Django, но постоянно, вы можете столкнуться с проблемами многопоточности.

В заключение, это вопрос мнения. На мой взгляд, как ограничения, так и настройки, необходимые для ORM Django отдельно от фреймворка, являются слишком большой ответственностью. В другом месте существуют совершенно жизнеспособные специализированные решения ORM, предназначенные для использования в библиотеках. Джанго нет.

Не думайте, что во всех вышеперечисленных шоу мне не нравится Django и все его работы, мне действительно очень нравится Django! Но я реалистично оцениваю ее возможности, и быть библиотекой ORM не входит в их число.

P.S. Поддержка нескольких соединений с базой данных работает . Но сейчас его там нет.

10 голосов
/ 04 июня 2009

(я сообщаю о своем решении, потому что мой вопрос назван дубликатом)

Хорошо, я понял это и опубликую решения для тех, кто пытается сделать то же самое.

Это решение предполагает, что вы хотите создавать новые модели.

Сначала создайте новую папку для хранения ваших файлов. Мы назовем это «standAlone». В "standAlone" создайте следующие файлы:

__init__.py
myScript.py
settings.py

Очевидно, что "myScript.py" можно назвать как угодно.

Затем создайте каталог для ваших моделей.

Мы назовем наш каталог моделей «myApp», но поймем, что это обычное приложение Django в проекте, поэтому, назовите его соответствующим образом для коллекции моделей, которые вы пишете.

В этом каталоге создайте 2 файла:

__init__.py
models.py

Вам понадобится копия manage.py из существующего проекта Django, или вы можете просто получить копию из пути установки Django:

django\conf\project_template\manage.py

Скопируйте manage.py в ваш каталог / standAlone. Хорошо, теперь у вас должна быть следующая структура:

\standAlone
    __init__.py
    myScript.py
    manage.py
    settings.py
\myApp
    __init__.py
    models.py

Добавьте в файл myScript.py следующее:

# settings.py
from django.conf import settings

settings.configure(
    DATABASE_ENGINE    = "postgresql_psycopg2",
    DATABASE_NAME      = "myDatabase",
    DATABASE_USER      = "myUsername",
    DATABASE_PASSWORD  = "myPassword",
    DATABASE_HOST      = "localhost",
    DATABASE_PORT      = "5432",
    INSTALLED_APPS     = ("myApp")
)

from django.db import models
from myApp.models import *

и добавьте это в файл settings.py:

    DATABASE_ENGINE    = "postgresql_psycopg2"
    DATABASE_NAME      = "myDatabase"
    DATABASE_USER      = "myUsername"
    DATABASE_PASSWORD  = "myPassword"
    DATABASE_HOST      = "localhost"
    DATABASE_PORT      = "5432",
    INSTALLED_APPS     = ("myApp")

и, наконец, ваш myApp / models.py:

# myApp/models.py
from django.db import models

class MyModel(models.Model):
     field = models.CharField(max_length=255)

и все. Теперь, чтобы Django управлял вашей базой данных, в командной строке перейдите в наш каталог / standalone и запустите:

manage.py sql MyApp
9 голосов
/ 24 февраля 2009

Вы можете использовать различные части Django в автономном режиме. В конце концов, это просто набор модулей Python, которые вы можете импортировать в любой другой код, который вы хотели бы использовать.

Я бы также порекомендовал взглянуть на SQL Alchemy , если вы только после части ORM.

5 голосов
/ 07 января 2014

Я использую django ORM без файла настроек. Вот как это сделать:

В файле запуска автономного приложения:

from django.conf import settings
from django.core.management import execute_from_command_line

#Django settings
settings.configure(DEBUG=False,
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': '/path/to/dbfile',
            'USER': '',
            'PASSWORD': '',
            'HOST': '',
            'PORT': '',
        }
    },
    INSTALLED_APPS = ('modelsapp',)
)

if not os.path.exists('/path/to/dbfile'):
    sync = ['manage.py', 'syncdb']
    execute_from_command_line(sync)

Теперь вам просто нужна папка ./modelsapp, содержащая __init__.py и models.py. Конфигурация использует sqlite для простоты, но она может использовать любой из db backends.

Структура папок:

./launcher.py
./modelsapp
    __init__.py
    models.py

Обратите внимание, что вам не нужно иметь правильно файл manage.py. import execute_from_command_line просто находит это.

4 голосов
/ 24 февраля 2009

Я рекомендую SQLAlchemy . Он должен выполнять все вещи ORM, а также основные вещи SQL.

2 голосов
/ 21 марта 2014

Этот пример очень прост. У меня уже есть приложение django, которое называется thab и работает. Я хочу использовать форму django в автономных скриптах на python и использовать те же модели, что и для веб-программирования. Вот пример:

# nothing in my sys.path contains my django project files
import sys
sys.path.append('c:\\apython\\thab')  # location of django app (module) called thab          where my settings.py and models.py is
# my settings.py file is actualy in c:\apython\thab\thab
from thab import settings as s  # need it because my database setting are there
dbs = s.DATABASES
from django.conf import settings
settings.configure(DATABASES=dbs) # configure can only be called once
from thab.models import *
boards = Board.objects.all()
print 'all boards:' + str(boards) # show all the boards in my board table
2 голосов
/ 11 мая 2011

Взгляните на django-standalone , который делает эту настройку довольно простой.

Я также нашел эту запись в блоге весьма полезной.

1 голос
/ 26 июля 2018

Использование Django 2.0 ORM - требуется один файл

from myproject.config import parse_config
from django import setup as django_setup
from django.conf import settings as django_settings

"""
Requirements:
  ODBC Driver: https://www.microsoft.com/en-ca/download/details.aspx?id=36434
  Django Engine: https://pypi.org/project/django-pyodbc-azure/
"""

config = parse_config()
django_settings.configure(
    DEBUG=True,
    DATABASES={
        'default': {
            'ENGINE': 'sql_server.pyodbc',
            'NAME': config.database_name,
            'HOST': config.database_server,  # exclude '\\MSSQLSERVER'
            'USER': config.database_username,
            'PASSWORD': config.database_password,
            'PORT': '',
            'AUTOCOMMIT': False,
            'OPTIONS': {
                'driver': 'ODBC Driver 11 for SQL Server',
            },
        },
    })
django_setup()


from django.db import models

class Foo(models.Model):
    name = models.CharField(max_length=25)

    class Meta:
        app_label = 'myapp'  # each model will require this
1 голос
/ 08 марта 2017

Вот что у меня сработало в Джанго> 1,4

Предполагая, что ваш автономный скрипт - это ваш проект django DIR.

Просто скопируйте это в файл conf.py (вы можете дать ему любое имя).

import os
import sys
import django

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR) 
#sys.path.append('c:\\apython\\thab')
 # location of django app (module) called thab          where my settings.py and models.py is
# my settings.py file is actualy in c:\apython\thab\thab
from elsaserver import settings as s  # need it because my database setting are there
dbs = s.DATABASES
from django.conf import settings
settings.configure(
    DATABASES=dbs,
    INSTALLED_APPS=('core.apps.CoreConfig', )) #add all the apps you need here
django.setup()

Затем импортируйте conf.py в скрипт Python.

Это структура проекта:

mydjangoproject
    |
    > app1
    > core
    > app2
    > standalone
    | | __init__.py  
    | | conf.py  
    | | myscript.py
    > manage.py
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...