как использовать сессию, не проходя ее [SqlAlchemy] - PullRequest
3 голосов
/ 05 июля 2010

Я хочу проверить разные значения в БД и создать новое значение, поэтому мне нужно выполнить запрос, и я не знаю, нужно ли мне создавать сеанс в моем классе SQLAlchemy или как мне это сделать? используя сеанс как глобальный ?, я не нашел в документации.

Что-то вроде этого:

class MyClass(Base):

    __tablename__ = 'my_class'
    __table_args__ = (UniqueConstraint('key', 'key2'),
                     {}
                     )
    id =  Column(Integer, Sequence('my_class_id'), primary_key=True)
    key = Column(String(30), nullable= False) #unique together key2
    key2 = Column(String(30), nullable = False) 
    value = Column(Integer, nullable=False)

    def __init__(self, key, key2):
        #check if exist key and key2
        values = session.query(MyClass.value).filter(MyClass.key == self.key).\
            filter(MyClass.key2 == self)

        if values:
            raise IntegrityError

        #get biggest value
        value = session.query(MyClass.value).filter(MyClass.key = self.key).order_by(asc(MyClass.value)) #I'm not shure if i need 'asc'
        #no value new key and key2

        if not value:
            self.key = key
            self.key2 = key2
            self.value = '000'
            return

        #i used a single table beacuse is easier to understand
        #in this example
        self.key = key
        self.key2 = key
        self.value = increment(value.first())

Я использую SQLALchemy 6.2 и декларативную

Спасибо

Ответы [ 2 ]

1 голос
/ 10 июля 2010

Вы должны будете сделать свое собственное управление сессиями - например, определить глобальный объект сеанса модуля.

Например, приложения Pylons определяют свою сессию следующим образом:

from sqlalchemy.orm import scoped_session, sessionmaker
Session = scoped_session(sessionmaker())

, а затем привязать его к двигателю с

Session.configure(bind=engine)

Использование scoped_session будет означать, что ваш код является поточно-ориентированным (каждый поток использует свой собственный сеанс).

1 голос
/ 05 июля 2010

Я нашел здесь , что мы можем сделать Session.object_session (self) :

def new_value(self):
    #not really DRY
    #the object has to be binded with some session first.
    session = Session.object_session(self) # << this is the important stuff

    #check if exist key and key2
    values = session.query(MyClass.value).filter(MyClass.key == self.key).\
        filter(MyClass.key2 == self)

    if values:
        return #None

    #get biggest value
    value = session.query(MyClass.value).\
               filter(MyClass.key = self.key).\
               order_by(desc(MyClass.value))

    return increment(value.first())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...