如何使用会话而不必传递它[SqlAlchemy]

时间:2010-07-05 11:30:47

标签: python sqlalchemy

我想检查数据库中的不同值并创建一个新值,所以我需要查询,我不知道是否必须在我的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 个答案:

答案 0 :(得分:1)

我发现here我们可以做 Session.object_session(自我)

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

答案 1 :(得分:1)

您必须自己进行会话管理 - 例如定义模块全局会话对象。

例如,Pylons应用程序定义了它们的会话:

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

然后将其绑定到带

的引擎
Session.configure(bind=engine)

使用scoped_session意味着您的代码是线程安全的(每个线程将使用自己的会话)。