【发布时间】:2015-06-22 01:25:19
【问题描述】:
我有一个“多租户”Flask网络应用程序,它与 1 个“主”MySQL 数据库(用于查找客户端信息)和数十个“客户端” MySQL 数据库(都具有相同的架构)。
我目前正在尝试使用 SQLAlchemy 和 Flask-SQLAlchemy 扩展 来与数据库交互,但我正在努力寻找一种方法来允许我在我的应用中定义的模型动态地将上下文从一个客户端数据库切换到另一个,具体取决于客户端。
在Flask-SQLAlchemy site上,一个简单的例子如下所示:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@Y.Y.Y.Y/db1'
db = SQLAlchemy(app)
class User(db.Model):
# Etc.
唯一的问题是,SQLALCHEMY_DATABASE_URI 配置是静态完成的。我可能需要在 mysql://username:password@Y.Y.Y.Y/db1 和 mysql://username:password@Z.Z.Z.Z/db1(或任何其他任意 MySQL URI)之间切换,具体取决于发出请求的客户端。
我发现了一些类似的问题(见下文),但在专门使用 Flask-SQLAlchemy 扩展时,我还没有找到一种干净的方法。
With sqlalchemy how to dynamically bind to database engine on a per-request basis
Flask SQLAlchemy setup dynamic URI
我还看到了一些为处理分片数据库提供的示例(这也应该适用,因为数据库本质上是由客户端在逻辑上分片的),但同样,这并不是 Flask-SQLAlchemy 特有的。
如果有意义,我也愿意直接使用 SQLAlchemy,无需 Flask-SQLAlchemy 扩展。我是 SQLAlchemy 的新手 - 任何帮助都将不胜感激!
编辑:能够反映数据库中的表模式将是一个奖励。
【问题讨论】:
-
你见过stackoverflow.com/questions/7923966/…吗?如果是,你还有什么问题?
-
@SeanVieira 谢谢 - 我刚刚检查了这个答案,这似乎是有道理的。我正在考虑为每个请求创建一个范围会话并将其存储在
flask.g中。我对如何设置课程本身感到困惑。在示例中,User是db.Model的子类,db是从SQLALCHEMY_DATABASE_URI初始化的。让User从使用sqlalchemy.ext.declarative.declarative_base()创建的基类继承也可以,或者我可以使用另一个类来代替不依赖于特定数据库配置的 Flask-SQLAlchemy 的db.Model?
标签: python flask sqlalchemy flask-sqlalchemy multi-tenant