不使用ORM的Pyramid和SqlAlchemy,Session的使用

0 投票
1 回答
2318 浏览
提问于 2025-04-18 13:26

这是对这个问题的进一步扩展。

我正在用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()并不会带来明显的性能损失。

撰写回答