不使用ORM的Pyramid和SqlAlchemy,Session的使用
这是对这个问题的进一步扩展。
我正在用Pyramid框架和SQLAlchemy(不使用它的ORM功能)来构建一个项目。我觉得会话(session)这个功能很好,因为这样我就不需要在每次请求结束时都提交一次。这是我实现的方式:
from sqlalchemy.orm import (
scoped_session,
sessionmaker,
)
from zope.sqlalchemy import ZopeTransactionExtension
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
问题:执行SQL语句时,我需要创建一个会话吗?
如果需要,我该如何使用DBSession来执行SQL语句?
如果不需要,那我该如何做到同样的事情,同时又能享受会话和zopeTransactionExtension()提供的所有功能?
1 个回答
0
是的,如果你想要使用“成功就提交,失败就回滚”的功能,那么你确实需要创建一个会话,这个会话是用ZopeTransactionExtension配置的。
def my_view(request):
session = DBSession()
result = session.execute("""SELECT spam, eggs FROM blah WHERE moo='foo'""")
data = []
for row in result:
data.append({
'spam': row.spam,
'eggs': row.eggs
})
return data
使用SQLAlchemy时,你也可以访问会话背后的“引擎”和“连接”,这样你就可以在事务块之外运行查询,或者使用特定的数据库连接,不过这可能只在非常特定的情况下有用。
我觉得到处使用session.execute()
并不会带来明显的性能损失。