каков рекомендуемый способ настройки соединения sqlalchemy для просмотра вызываемых объектов?

Я использую язык выражений sqlalchemy для его нотации и пула соединений для создания объектов dao для связи с уровнем сохраняемости. Я хотел узнать мнение о том, как мне следует настроить метаданные и движок, чтобы они были доступны для вызываемых приложений. Согласно документации sqlalchemy http://docs.sqlalchemy.org/en/rel_0_7/core/connections.html, они обычно связаны и объявлены глобальными, однако я не считаю ни этот, ни одноэлементный подход хорошими идеями. Любые мысли будут оценены ...

Вот как выглядит мой файл __init__.py в каталоге моего проекта:

from pyramid.config import Configurator
from sqlalchemy import engine_from_config, MetaData, create_engine
from pyramid_beaker import session_factory_from_settings

db_url = 'postgresql://user:password@localhost/dbname'
engine = create_engine(db_url)
meta = MetaData()

def main(global_config, **settings):
    meta.bind = engine
    .
    .
    .
    [other configuration settings]

person Jaigus    schedule 11.08.2012    source источник


Ответы (2)


Документация Pyramid включает руководство по интеграции Pyramid с SQLAlchemy.

Существует два специальных пакета, которые интегрируют транзакции SQLAlchemy и управление сеансами с Pyramid: pyramid_tm и zope.sqlalchemy. Вместе они позаботятся о ваших сеансах:

from sqlalchemy import engine_from_config

from .models import DBSession

def main(global_config, **settings):
    """This function returns a Pyramid WSGI application."""

    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)
    # Configuration setup

Здесь мы берем настройки конфигурации из вашего .ini файла конфигурации; и в models.py:

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy.orm import (
    scoped_session,
    sessionmaker,
    )

from zope.sqlalchemy import ZopeTransactionExtension

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Base = declarative_base()

class YourModel(Base):
    # Define your model

Обратите внимание на использование здесь scoped_session, используя расширение транзакций для интеграции с Pyramid.

Затем в представлениях все, что вам нужно сделать, это использовать фабрику сеансов DBSession для получения ваших сеансов:

from pyramid.view import view_config
from .models import (
    DBSession,
    YourModel,
    )

@view_config(...)
def aview(request):
    result = DBSession.query(YourModel).filter(...).first()

Фиксация и откат будут интегрированы с запросом; коммит на 2хх и 3хх, откат на исключениях, например.

person Martijn Pieters    schedule 11.08.2012
comment
Спасибо за ответ. Используя декларативную базу, разве это не использует форму для сопоставления таблиц с их подклассами? Я хочу использовать только язык выражений, а не форму. Я хотел сделать что-то очень похожее, чтобы модели наследовали таблицы и использовали модели для инкапсуляции таблиц из остальной части приложения; но без использования орм. Я использую sqlalchemy только для языка выражений и объединения соединений. Я просто ищу способ настроить пул соединений с базой данных и сделать их доступными для вызываемых объектов представления. - person Jaigus; 12.08.2012
comment
Я также планирую наследовать классы таблиц (некоторые из представлений) классами моделей, которые в основном предназначены для инкапсуляции классов таблиц из остальной части приложения. Я хочу выполнять грубые задачи, используя язык выражений, а не форму для этого. - person Jaigus; 12.08.2012
comment
Затем просто используйте фабрику сеансов с ограниченной областью действия (DBSession) и оставьте код declarative_base(). - person Martijn Pieters; 12.08.2012
comment
Прочитав документацию еще раз, я понял, что если используется нестандартный подход, прямое использование объекта механизма через create_engine является соглашением (путем объявления его в глобальной области видимости), поскольку объект механизма фактически предназначен для использования одновременно в процессе, представляя один URL-адрес базы данных. Объекты сеанса являются частью пакета orm и, очевидно, предназначены для использования с файлом orm. Спасибо за ваш полезный ответ. - person Jaigus; 12.08.2012

Я думаю, что примеры документов sqlalchemy объявляют их глобальными для краткости, а не для указания того, что они рекомендуют это.

Я думаю, что единственное, что вы действительно хотите передать различным частям вашего приложения, — это объект Session. Более простой вариант — использовать сеанс с областью действия (которую, как мне кажется, книга O'Reilly по sqlalchemy на самом деле рекомендует для более простых веб-приложений; ваш код предполагает, что это веб-приложение). Я думаю, что очень мало приложений нуждаются в движке или метаданных в любом месте, кроме случаев, когда вы устанавливаете соединение с базой данных.

Сеанс с ограниченной областью также будет создан при создании механизма и метаданных при запуске приложения (в случае пирамиды — в функции main здесь). Затем вы должны передать его в качестве параметра различным частям вашего приложения, которым требуется доступ к базе данных.

person JosefAssad    schedule 11.08.2012