首页 文章

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

提问于
浏览
14

我的应用程序使用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

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

2 回答

  • 28

    一旦您的表单被验证等,

    要添加新记录:

    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()
    

    更新的技巧是你只需要更改特定字段并进行提交 . 数据库会话处理休息 . 我认为您正在使用现在在SQLAlchemy中弃用的合并函数 .

  • 4

    我已设法解决了对 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)
    

相关问题