问题描述
我想知道是否有可能使用用户传递的输入来创建SqlAlchemy数据库URI。例如,具有输入文本字段,用户将不得不在其中输入创建数据库uri所需的参数。只有这样才能建立连接,然后用户才能访问数据库中的数据。
解决方法
实际上,这是可能的。但是您需要在没有flask-sqlalchemy
的情况下管理数据库连接。
您需要用于数据库引擎的存储以及用于更新它的路由。数据库引擎将以此方式创建,并通过执行简单请求来测试它们是否真正起作用。数据库URI被保存到用户会话中以供以后使用:
from flask import Flask,Response,render_template,request,session
from sqlalchemy import create_engine
from sqlalchemy.exc import OperationalError
ENGINES = {}
app = Flask(__name__)
@app.route("/set_database_uri",methods=("GET","POST"))
def set_database_uri():
if request.method == "POST":
database_uri = request.form["database_uri"]
if database_uri not in ENGINES:
engine = create_engine(database_uri)
try:
engine.execute("SELECT 1")
except OperationalError:
return Response("Invalid database URI",400)
ENGINES[database_uri] = engine
session["database_uri"] = database_uri
return render_template("database_uri.html")
这些引擎可用于产生SQLAlchemy会话以进行所需的数据库操作:
from flask import redirect,session,url_for
from sqlalchemy.orm import Session
@app.route("/records")
def get_records():
if "database_uri" not in session:
return redirect(url_for("set_database_uri"))
db_session = Session(session["database_uri"])
records = db_session.query(Record).all()
db_session.close()
return render_template("records.html",records=records)
尽管在技术上可行,但不建议使用此方法。由于潜在的用户可以创建与应用程序主机上可用的任何数据库的数据库连接,因此可能会导致严重的安全漏洞。
但是,如果要创建某种数据库管理界面,它可能会很有用。