一尘不染

Flask-SQLAlchemy:如何有条件地插入或更新行

flask

我的应用程序结合使用Flask,Flask-SQLAlchemy,Flask-WTF和Jinja2。

在当前版本中,我有一个设置表。该表将只有一个记录和一个字段。最初,该表包含零个记录。

我要实现的是:

  • 鉴于db中不存在任何条目,因此请显示空表单以供用户输入
  • 假设存在一个条目,请显示该条目,然后
  • 如果用户更改值,则更新db中的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

表格

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?


阅读 1305

收藏
2020-04-07

共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中弃用。

2020-04-07