我的应用程序结合使用Flask,Flask-SQLAlchemy,Flask-WTF和Jinja2。
在当前版本中,我有一个设置表。该表将只有一个记录和一个字段。最初,该表包含零个记录。
我要实现的是:
这是我的代码:
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?
表单通过验证后,
要添加新记录:
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中弃用。