Flask-SQLAlchemy:如何有条件地插入或更新一行 [英] Flask-SQLAlchemy: How to conditionally insert or update a row
问题描述
在目前的版本中,我有一个设置表。该表只有一个记录和一个字段。最初该表包含零个记录。
我想达到的是:
- db,然后显示空的表单准备好用户输入
- 如果存在条目,则显示条目,如果用户更改了值,则显示
- 然后更新数据库中的rec。
这是我的代码:
models.py
class Provider(db.Model):
id = db。列(db.teger,primary_key = True)
rssfeed = db.Column(db.String(120),unique = True)
$ b $ def __init __(self,rssfeed):
self.rssfeed = rssfeed
$ b $ 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
$ b $ if request.method ==POST和form.validate():
如果Provider.query.get(1)是None:
provider = Provider(rssfeed = form.rssfeed.data)
form.populate_obj(provider)
db.session。添加(提供者)
db.session.commit()
flash(添加设置)
返回render_template(settings.html,form = form)
现在,如果代码不存在,则会创建一条记录,但
rssfeed
列是空的。
如果记录不存在,如何更改此代码以使它
INSERT UPDATE
如果是这样的话?解决方案>
添加新记录:
new_provider = Provider(form.rssfeed。数据)
db.session.add(new_provider)
db.session.commit()
更新现有记录:
$ p $ lt; code> existing_provider = Provider.query.get(1)#或其他
#更新rssfeed列
existing_provider.rssfeed = form.rssfeed.data
db.session.commit()
更新的技巧是你只需要改变特定的字段并进行提交。休息是由数据库会话照顾。我想你正在使用现在在SQLAlchemy中不赞成使用的合并功能。
My application uses a combination of Flask, Flask-SQLAlchemy, Flask-WTF and Jinja2.
In its current incarnation, I have a settings table. The table will only have one record with one field. Initially the table contains zero records.
What I want to achieve is:
- Given that no entries exist in db, then show empty form ready for user input
- Given that an entry exist, show the entry, and
- if the user changes the value, then update the rec in db.
Here is my code:
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)
As it stands this code creates a record if it doesn't exists but the
rssfeed
column is empty.How can I change this code so that it will
INSERT
if the record doesn't exist andUPDATE
if it does?解决方案Once your form is validated etc,
To add a new record:
new_provider = Provider(form.rssfeed.data) db.session.add(new_provider) db.session.commit()
To update an existing record:
existing_provider = Provider.query.get(1) # or whatever # update the rssfeed column existing_provider.rssfeed = form.rssfeed.data db.session.commit()
The trick in updating is that you just have to change the particular field and do a commit. rest is taken care by the db session. I think you are using the merge function which is now deprecated in SQLAlchemy.
这篇关于Flask-SQLAlchemy:如何有条件地插入或更新一行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!