簡體   English   中英

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

[英]Flask-SQLAlchemy: How to conditionally insert or update a row

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

一旦您的表單被驗證等,

要添加新記錄:

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中棄用的合並函數。

我設法解決了對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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM