作为Pylons用户,我正试图切换到金字塔,现在试图了解差异。
在Pylons中,我习惯在myproj.model.meta
中将Session定义为:
Session = scoped_session(sessionmaker())
然后在myproj.model
中导入它以定义模型,依此类推,然后在app中引用:
root = Session.query(MyModel).filter(...)...
现在使用Pyramid中的默认模板(pyramid_routesalchemy)我像以前一样定义Session(除了调用它DBSession
并添加扩展名):
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
但在views.py
我不直接使用它,但实例化它:
dbsession = DBSession()
root = dbsession.query(MyModel).filter(...)...
为什么呢?有什么区别?
此外,与金字塔有什么不同
import transaction
...
model = MyModel(name=u'root', value=55)
session.add(model)
session.flush()
transaction.commit()
到Pylons
model = MyModel(name=u'root', value=55)
session.add(model)
session.commit()
答案 0 :(得分:10)
实际上,查找sqlalchemy会话实例进行查询的方式与塔架和/或金字塔没有任何关系。 Pylons可能已经建议将其中一种方式作为“标准”挂架方式,但就是这样。您获得会话的方式之间唯一真正的区别在于使用ZopeTransactionExtension的示例。
ZopeTransactionExtension是一个小块,确保每个打开的会话都加入一个活动的事务。因此,如果您打开5个会话,他们将加入相同的交易。这样,如果您提交或回滚事务,则5个会话中的任何一个完成的所有工作都将效仿。交易模块(“transaction.commit()”)在这里是关键。
pyramid_tm尝试直接设置事务...它在请求输入时启动一个,所有作用域数据库会话加入它...然后在请求结束时,如果它发现错误,它将回滚交易。否则,将提交事务。这样,视图级代码就不必手动创建或关闭/提交/回滚事务。
主要是session.flush()用于确保您的数据库模型实例在不提交事务的情况下填充其主键。
所以你需要做的就是:
def myview(request):
session = DBsession()
session.add(model)
pyramid_tm将确保会话被正确提交或回滚。
答案 1 :(得分:0)
对于记录,发出dbsession.flush()似乎对我有用(它导致会话提交),我不需要处理任何额外的导入。