烧瓶的SQLAlchemy:如何有条件地插入或更新一行(Flask-SQLAlchemy: How

2019-07-30 04:51发布

我的应用程序使用烧瓶,烧瓶SQLAlchemy的,瓶,跆拳道和Jinja2的组合。

在目前的化身,我有一个设置表。 该表将只具有一个字段的一个记录。 最初,表中包含零个记录。

我想实现的是:

  • 由于在数据库中不存在条目,则显示空单准备用于用户输入
  • 鉴于条目存在,表明该条目,
  • 如果用户更改的价值,然后更新分贝REC。

这里是我的代码:

models.py

class Provider(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    rssfeed = db.Column(db.String(120), unique = True)

    def __init__(self, rssfeed):
        self.rssfeed = rssfeed

    def __repr__(self):
        return '<NZBMatrix feed url %r>' % self.rssfeed

forms.py

class SettingsForm(Form):
    rssfeed = TextField('rssfed', validators= [Required()])

views.py

    @app.route('/settings', methods=["GET","POST"])
    def settings():
    """ show settings """
        provider = Provider.query.get(1)
        form = SettingsForm(obj=provider)
        print provider

        if request.method == "POST" and form.validate():
            if Provider.query.get(1) is None:
                provider = Provider(rssfeed=form.rssfeed.data)
                form.populate_obj(provider)
                db.session.add(provider)
                db.session.commit()
                flash("Settings added")

        return render_template("settings.html", form=form)

因为它代表该代码创建,如果它不存在,但该记录rssfeed栏是空的。

我怎样才能改变这种代码,以便将INSERT如果记录不存在, UPDATE ,如果它?

Answer 1:

一旦你的表单验证等,

要添加一个新的记录:

new_provider = Provider(form.rssfeed.data)
db.session.add(new_provider)
db.session.commit()

要更新现有的记录:

existing_provider = Provider.query.get(1) # or whatever
# update the rssfeed column
existing_provider.rssfeed = form.rssfeed.data
db.session.commit()

在更新的诀窍是,你只需要改变的特定领域,并做了承诺。 其余部分由DB会话照顾。 我认为你正在使用现在已不建议在SQLAlchemy的合并功能。



Answer 2:

我已成功地解决了做这些改动view.py文件的问题:

@app.route('/settings', methods=["GET","POST"])
def settings():
    """ show settings """
    provider = Provider.query.get(1)
    form = SettingsForm(request.form,obj=provider)

    if request.method == "POST" and form.validate():
        if provider:
            provider.rssfeed = form.rssfeed.data
            db.session.merge(provider)
            db.session.commit()
            flash("Settings changed")
            return redirect(url_for("index"))
        else:
            provider = Provider(form.rssfeed.data)
            db.session.add(provider)
            db.session.commit()
            flash("Settings added")
            return redirect(url_for("index"))
    return render_template("settings.html", form=form)


文章来源: Flask-SQLAlchemy: How to conditionally insert or update a row