简体   繁体   English

使用 flask-sqlalchemy 动态链接到数据库

[英]Dynamically linking to databases using flask-sqlalchemy

I'm building an api that creates users and each user get a new database.我正在构建一个 api 来创建用户,并且每个用户都会获得一个新数据库。 I'd like to link flask-sqlalchemy to that database created.我想将 flask-sqlalchemy 链接到创建的数据库。 Is there an easy way to do that?有没有简单的方法可以做到这一点?

I also want to make it clear that the reason each use gets their own database is to meet regulation so rearranging the schema so that everything is in one database is not an option.我还想明确指出,每个用户拥有自己的数据库的原因是为了满足法规要求,因此重新安排架构以使所有内容都在一个数据库中不是一种选择。

I'm thinking of going with vanilla sqlalchemy as described here: https://dev.to/nestedsoftware/flask-and-sqlalchemy-without-the-flask-sqlalchemy-extension-3cf8 but I want to make sure I have no other options.我正在考虑使用香草 sqlalchemy,如下所述: https://dev.to/nestedsoftware/flask-and-sqlalchemy-without-the-flask-sqlalchemy-extension-3cf8但我想确保我没有其他选项。

Without posting the entire code, the key concepts I use using Flask-SQLalchemy to have dynamic databases are:在不发布整个代码的情况下,我使用 Flask-SQLalchemy 来拥有动态数据库的关键概念是:

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

Have a global database registry拥有一个全局数据库注册表

DATABASE_REGISTRY = {}
SESSION_MAKER = db.sessionmaker()

create the database engine and add to registry (I have this in another helper function)创建数据库引擎并添加到注册表(我在另一个辅助函数中有这个)

engine = db.create_engine(db_uri)
DATABASE_REGISTRY['username'] = { 'engine': engine}

Then to get the user db dynamically, have a helper function然后动态获取用户数据库,有一个助手 function

def get_db_session(username):
    db_session = SESSION_MAKER(bind=DATABASE_REGISTRY.get(username)['engine'])
    return db_session

Then you can use:然后你可以使用:

db_session = get_db_session('user_bob')

bob_query = db_session.query(ATable).all()

And don't forget to close the session并且不要忘记关闭 session

db_session.close()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM