我有一个“ 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/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 的新手 - 非常感谢任何帮助!
编辑:能够反射(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/