我正在Flask项目上工作,我正在使用Flask-SQLAlchemy。
我需要使用多个已有的数据库。
我创建的“应用程序”对象和SQLAlchemy的一个:
Flask-SQLAlchemy - 会话如何与多个数据库一起工作?
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
在我设置默认连接和附加结合的结构:
SQLALCHEMY_DATABASE_URI = 'postgresql://pg_user:[email protected]_server/pg_db'
SQLALCHEMY_BINDS = {
'oracle_bind': 'oracle://oracle_user:[email protected]_server/oracle_schema',
'mssql_bind': 'mssql+pyodbc://msssql_user:[email protected]_server/mssql_schema?driver=FreeTDS'
}
然后,我使用创建的表的模型声明系统,并根据需要设置 __bind_key__
参数以指示表位于哪个数据库中。
例如:
class MyTable(db.Model):
__bind_key__ = 'mssql_bind'
__tablename__ = 'my_table'
id = db.Column(db.Integer, nullable=False, primary_key=True)
val = db.Column(db.String(50), nullable=False)
这样一切正常,当我这样做是正确的数据库上进行查询。
阅读SQLAlchemy的文档和烧瓶SQLAlchemy的文档,我明白这事 (我写下来,检查我理解正确):
- 您可以通过会话处理事务。
- 在SQLAlchemy中,您可以将会话与特定引擎绑定。
- 瓶-SQLAlchemy中自动创建在请求启动会话(scoped_session),并破坏它在请求端
所以我可以做:
record = MyTable(1, 'some text')
db.session.add(record)
db.session.commit()
我不明白什么当我们在Flask-SqlAlchemy中使用关于会话的多个数据库时发生。
我核实,该系统能够在正确的表在正确数据库通过__bind_key__
参数绑定, 我可以,因此,通过db.session
插在不同的数据库中的数据,并在提交时,一切都将被保存。
但是,我不能理解Flask-SQLAlchemy是否创建多个会话(每个引擎一个会话)或者以不同的方式管理事物。
在这两种情况下,如何引用特定数据库的会话/事务?
如果我使用db.session.commit()
系统会在所有涉及的数据库上进行提交,但如果我只想提交一个数据库,该怎么办?
我会做这样的事情:
db.session('mssql_bind').commit()
,但我无法弄清楚如何做到这一点。
我还看到一个烧瓶SQLAlchemy的实施应该缓解这些情况的管理:
问题:https://github.com/mitsuhiko/flask-sqlalchemy/issues/107
实现:https://github.com/mitsuhiko/flask-sqlalchemy/pull/249
但我无法弄清楚如何使用它。
在Flask-SQLAlchemy中,我怎样才能专门为每个单引擎管理会话?
相关:[在Flask中使用具有不同绑定的表的相同名称](// stackoverflow.com/q/15336778) –