Flask-SQLAlchemy使用定制的会话,该会话根据
__bind_key__映射类中的给定属性处理绑定路由。实际上,它实际上将该键作为信息添加到创建的表中。换句话说,Flask不会创建多个会话,每个绑定一个会话,而是一个单个会话,该会话根据绑定键路由到正确的可连接对象(引擎/连接)。请注意,香草SQLAlchemy具有开箱即用的类似功能。
在这两种情况下,如何引用特定数据库的会话/事务?如果我使用
db.session.commit()系统,那么是否对所有涉及的数据库都进行提交,但是如果我只想对单个数据库进行提交,该怎么办?
在会话中使用会话拥有的连接来颠覆并向特定数据库提交提交不是一个好主意。会话是一个整体,并跟踪对象实例的状态,在需要时刷新对数据库的更改等。这意味着会话所处理的事务不仅是数据库事务,而且是会话本身的事务。所有这些都应该提交和回滚。
另一方面,您可以创建新的SQLAlchemy(或Flask-
SQLAlchemy)会话,这些会话可能通过绑定之一加入正在进行的事务:
session = db.create_scoped_session( options=dict(bind=db.get_engine(app, 'oracle_bind'), binds={}))
这就是请求请求的内容。它允许使用现有的事务连接作为新Flask-SQLAlchemy会话 的
绑定。例如,在测试中这是非常有用的,从该请求请求的原理中可以看出。这样,您可以拥有一个“主”事务,例如可以回滚测试中完成的所有 *** 作。
请注意,如果存在 bind_key
,则
SignallingSession始终会查询该
db.get_engine()方法。这意味着示例会话无法在没有绑定键的情况下查询表,并且该表在您的oracle
DB上不存在,但仍适用于具有 mssql_bind 键的表。
另一方面,您链接到的问题确实列出了将SQL发出到特定绑定的方法:
rows = db.session.execute(query, params, bind=db.get_engine(app, 'oracle_bind'))
还列出了其他不太显式的方法,但是显式比隐式更好。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)