python - 使用 flask-sqlalchemy 动态链接到数据库
问题描述
我正在构建一个创建用户的 api,每个用户都会获得一个新的数据库。我想将 flask-sqlalchemy 链接到创建的数据库。有没有简单的方法可以做到这一点?
我还想明确指出,每个用户都拥有自己的数据库的原因是为了满足法规要求,因此重新安排架构以使所有内容都在一个数据库中不是一种选择。
我正在考虑使用香草 sqlalchemy,如下所述:https ://dev.to/nestedsoftware/flask-and-sqlalchemy-without-the-flask-sqlalchemy-extension-3cf8但我想确保我没有其他选项。
解决方案
在不发布整个代码的情况下,我使用 Flask-SQLalchemy 来拥有动态数据库的关键概念是:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
拥有一个全局数据库注册表
DATABASE_REGISTRY = {}
SESSION_MAKER = db.sessionmaker()
创建数据库引擎并添加到注册表(我在另一个辅助函数中有这个)
engine = db.create_engine(db_uri)
DATABASE_REGISTRY['username'] = { 'engine': engine}
然后动态获取用户数据库,有一个辅助函数
def get_db_session(username):
db_session = SESSION_MAKER(bind=DATABASE_REGISTRY.get(username)['engine'])
return db_session
然后你可以使用:
db_session = get_db_session('user_bob')
bob_query = db_session.query(ATable).all()
并且不要忘记关闭会话
db_session.close()
推荐阅读
- javascript - 如何在 PIXI.JS 的过滤器或片段着色器中更新时间统一?
- arrays - Mongo $projection,你能扁平化一个子文档数组吗?
- jquery - .outerHeight(); 获得十进制值?
- oracle - 我可以使用 Toad 连接到 Oracle Db,但使用 sqlplus 的连接不起作用。获取 TNS 超时错误
- flutter - Flutter app/build.gradle 错误但应用程序有效
- docker - 使用 Gitlab CI docker-in-docker 时如何修复 docker 容器中的“sh: tsc not found”错误
- php - 如何在循环开始时使用输出变量循环来处理我的重复事件?PHP
- sql - 如何根据包含最小值和最大值的表从另一个表中选择行
- javascript - 在 VSCode 的 NodeJs 调试器中使用“esm”
- javascript - 如何在 Firestore 中创建新的用户文档