【发布时间】:2016-11-17 08:37:13
【问题描述】:
我正在开发一个 Flask 项目,我正在使用 Flask-SQLAlchemy。
我需要使用多个已经存在的数据库。
我创建了“app”对象和 SQLAlchemy 对象:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
在配置中我设置了默认连接和附加绑定:
SQLALCHEMY_DATABASE_URI = 'postgresql://pg_user:pg_pwd@pg_server/pg_db'
SQLALCHEMY_BINDS = {
'oracle_bind': 'oracle://oracle_user:oracle_pwd@oracle_server/oracle_schema',
'mssql_bind': 'mssql+pyodbc://msssql_user:mssql_pwd@mssql_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 文档和 Flask-SQLALchemy 文档我了解这些事情
(我把它们写下来以检查我是否理解正确):
- 您可以通过会话处理事务。
- 在 SQLAlchemy 中,您可以将会话与特定引擎绑定。
- Flask-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()
但我不知道该怎么做。
我还看到了一个 Flask-SQLAlchemy 实现,它应该可以简化这些情况的管理:
问题:https://github.com/mitsuhiko/flask-sqlalchemy/issues/107
实施:https://github.com/mitsuhiko/flask-sqlalchemy/pull/249
但我不知道如何使用它。
在 Flask-SQLAlchemy 中,如何专门为每个引擎管理会话?
【问题讨论】:
-
希望对您有所帮助,这是我的回答。 stackoverflow.com/a/70076061/3638954
标签: python flask sqlalchemy flask-sqlalchemy