我正在尝试将一些数据库逻辑分离到自己的帮助程序模块中。这是因为我有几条执行相同数据库功能的路由,我不想继续重复相同的代码。我对db会话范围有点困惑。
来自SQLAlchemy文档:
一些Web框架包括基础结构,以协助将会话的生命周期与Web请求的生命周期保持一致。这包括Flask-SQLAlchemy等产品,可与Flask Web框架结合使用......
我认为这意味着我的db会话范围包含在特定路由中,因为我使用Flask和Flask-SQLAlchemy,所以我想出了以下内容:
init.py
app = Flask(__name__)
db = SQLAlchemy(app)
routes.py
from init import db
@app.route('/one')
def one():
form = MyForm()
if form.validate_on_submit():
myhelper.saveStuff1(form.stuff1.data)
myhelper.saveStuff2(form.stuff2.data)
db.session.commit()
return render_template(...)
@app.route('/two')
def two():
form = MyForm()
if form.validate_on_submit():
myhelper.saveStuff1(form.stuff1.data)
myhelper.saveStuff2(form.stuff2.data)
myhelper.saveStuff3(form.stuff3.data)
db.session.commit()
return render_template(...)
myhelper.py
from init import db
# Add new Item
def saveStuff1(formdata):
db.session.add(Item(name=formdata))
# Update Item
def saveStuff2(formdata):
item = Item.query.filter_by(name=formdata).first()
item.description = 'default'
db.session.add(item)
# etc...
这是构建我的助手的正确方法吗?我担心from init import db
会导致范围问题,因为它会在两个文件中导入,或者这个整体代码模式会导致其他问题。
答案 0 :(得分:0)
SQLAlchemy的会话范围与Python的变量范围无关。所以不,如您所示,在多个地方导入db
不会导致问题。关于会话范围,Flask-SQLAlchemy会为您解决这个问题,因此您可以忽略(或不担心)SQLAlchemy文档中对范围的讨论。