问题描述
我想知道是否可以使用用户传入的输入创建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的会话。