Динамическое связывание с базами данных с помощью flask-sqlalchemy - PullRequest
0 голосов
/ 06 ноября 2019

Я создаю API, который создает пользователей, и каждый пользователь получает новую базу данных. Я хотел бы связать flask-sqlalchemy с созданной базой данных. Есть ли простой способ сделать это?

Я также хочу прояснить, что причина, по которой каждое использование получает свою собственную базу данных, состоит в том, чтобы соответствовать нормативам, поэтому изменение схемы так, чтобы все в одной базе данных не было вариантом.

Я думаю о ванильной sqlalchemy, как описано здесь: https://dev.to/nestedsoftware/flask-and-sqlalchemy-without-the-flask-sqlalchemy-extension-3cf8, но я хочу убедиться, что у меня нет других вариантов.

1 Ответ

1 голос
/ 07 ноября 2019

Без публикации всего кода ключевые концепции, которые я использую с помощью 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}

Затем, чтобы динамически получить пользователь db, есть вспомогательная функция

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()
...