Python Alchemy:如何有条件地插入或更新行

Python Alchemy:如何有条件地插入或更新行,python,flask,flask-sqlalchemy,wtforms,flask-wtforms,Python,Flask,Flask Sqlalchemy,Wtforms,Flask Wtforms,我的应用程序使用了Flask、Flask SQLAlchemy、Flask WTF和Jinja2的组合 在它当前的化身中,我有一个设置表。该表只有一条记录和一个字段。最初,该表包含零条记录 我想要实现的是: 假设数据库中不存在条目,则显示空表单以供用户输入 假设存在条目,则显示该条目,然后 如果用户更改了该值,则更新数据库中的rec 这是我的密码: 型号.py class Provider(db.Model): id = db.Column(db.Integer, primary_k

我的应用程序使用了Flask、Flask SQLAlchemy、Flask WTF和Jinja2的组合

在它当前的化身中,我有一个设置表。该表只有一条记录和一个字段。最初,该表包含零条记录

我想要实现的是:

  • 假设数据库中不存在条目,则显示空表单以供用户输入
  • 假设存在条目,则显示该条目,然后
  • 如果用户更改了该值,则更新数据库中的rec
这是我的密码:

型号.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()])
    @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)
视图.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()])
    @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
列为空,则此代码将创建一条记录


如何更改此代码,使其在记录不存在时插入,如果存在则更新?

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

一旦你的表格被确认等

要添加新记录,请执行以下操作:

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

仅供参考-
表单。validate
应该是
表单。validate()
-函数总是真实的,但表单可能无法通过验证。感谢您指出这一点!在增加一项新记录时,比赛情况如何?