我想检查数据库中的不同值并创建一个新值,所以我需要查询,我不知道是否必须在我的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和声明性
由于
答案 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意味着您的代码是线程安全的(每个线程将使用自己的会话)。