我正在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) –