在Flask-Sqlalchemy中将一些数据库逻辑移动到自己的帮助器模块?

时间:2015-09-16 19:28:58

标签: python flask flask-sqlalchemy

我正在尝试将一些数据库逻辑分离到自己的帮助程序模块中。这是因为我有几条执行相同数据库功能的路由,我不想继续重复相同的代码。我对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会导致范围问题,因为它会在两个文件中导入,或者这个整体代码模式会导致其他问题。

1 个答案:

答案 0 :(得分:0)

SQLAlchemy的会话范围与Python的变量范围无关。所以不,如您所示,在多个地方导入db不会导致问题。关于会话范围,Flask-SQLAlchemy会为您解决这个问题,因此您可以忽略(或不担心)SQLAlchemy文档中对范围的讨论。