使用用户输入动态创建烧瓶SQLALCHEMY数据库连接

人气:716 发布:2022-10-16 标签: python-3.x flask flask-sqlalchemy

问题描述

我想知道是否可以使用用户传入的输入创建SqlAlChemy数据库URI。例如,具有用户将必须在其中输入创建数据库URI所需的参数的输入文本字段。只有这样才能建立连接,然后用户才能访问数据库中的数据。

推荐答案

我刚刚遇到了相同的问题,我是这样修复的。

配置部分:

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
from contextlib import contextmanager

from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

from greenwater_app import app


app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db/database1.db'
app.config['SQLALCHEMY_BINDS'] = {
    'database2': 'sqlite:///db/database2.db'
}
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_ECHO'] = True

db = SQLAlchemy(app)

migrate = Migrate(app, db, compare_type=True)


@contextmanager
def session_scope(bind='default'):
    """Provide a transactional scope around a series of operations."""

    if bind != 'default':
        s = db.create_scoped_session(options={'bind': db.get_engine(db.get_app(), bind)})
    else:
        s = db.session

    s.expire_on_commit = False
    try:
        yield s
        s.commit()
    except:
        s.rollback()
        raise
    finally:
        s.close()

然后,我们可以将";BIND_KEY";作为";数据库2";添加到类定义中,以使用";数据库2";。就像这样。 https://flask-sqlalchemy.palletsprojects.com/en/2.x/binds/

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
class User(db.Model, BaseModelMixin):
    __bind_key__ = "database2"
    __tablename__ = "user"

如果我们想召开一次特别会议,我们可以这样做。

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
sql = 'select * from user'
with session_scope(bind='database2') as s:
    res = s.execute(sql).fetchall()
    print([dict(r) for r in res])

with session_scope() as s:
    res = s.execute(sql).fetchall()
    print([dict(r) for r in res])

SESSION_SCOPE(绑定=‘数据库2’)将获取数据库2的会话。

289