python - 在 Multi-Tenancy 应用程序中动态设置 Flask-SQLAlchemy 数据库连接

标签 python flask sqlalchemy flask-sqlalchemy multi-tenant

我有一个“ Multi-Tenancy 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/db1mysql://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 的新手 - 非常感谢任何帮助!

编辑:能够反射(reflect)数据库中的表架构将是一个奖励。

最佳答案

如果您使用的是 flask-sqlalchemy 0.12 或更高版本,则 BINDS 支持此功能。

SQLALCHEMY_DATABASE_URI = 'postgres://localhost/main'
SQLALCHEMY_BINDS = {
'users':        'mysqldb://localhost/users',
'appmeta':      'sqlite:////path/to/appmeta.db'
}

并且您可以在模型定义中指定连接数据库。

class User(db.Model):
    __bind_key__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)

它将使用 mysqldb auto。更详细的可以引用官方文档。 Multiple Databases with Binds

关于python - 在 Multi-Tenancy 应用程序中动态设置 Flask-SQLAlchemy 数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29661159/

相关文章:

python - 高效地迭代 SQLAlchemy 集合

python - QTableView排序时如何保留选择

python - Flask Web 服务中的 KeyError

python - 如何使用python提高sql数据库的写入速度

枚举所有具有 5 个节点的无环有向图的 Python 代码

python - SQLAlchemy 不会在 MySQL [Debian Linux] 上创建外键

python - 如何使用多级/多连接在 SQLAlchemy 中指定表关系?

flask - Flask-Login 的 `remember_me` 是否覆盖 Flask 的 `permanent` ?

python - 将带有 jsonb_each 的 Postgresql 查询转换为 sqlalchemy

python - Session.add() 不适用于 SqlAlchemy(Python2.7)