Flask-SQLAlchemy:如何有条件地插入或更新一行
Posted
技术标签:
【中文标题】Flask-SQLAlchemy:如何有条件地插入或更新一行【英文标题】:Flask-SQLAlchemy: How to conditionally insert or update a row 【发布时间】:2012-07-02 19:18:49 【问题描述】:我的应用程序使用了 Flask、Flask-SQLAlchemy、Flask-WTF 和 Jinja2 的组合。
在其当前版本中,我有一个设置表。该表将只有一条记录和一个字段。最初,该表包含零条记录。
我想要实现的是:
鉴于 db 中不存在任何条目,则显示空表单以供用户输入 假设存在条目,请显示该条目,然后 如果用户更改了值,则更新数据库中的记录。这是我的代码:
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
?
【问题讨论】:
仅供参考 -form.validate
应该是 form.validate()
- 函数始终是真实的,但您的表单可能无法通过验证。
感谢您指出这一点!
【参考方案1】:
一旦您的表单经过验证等,
添加新记录:
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 中现已弃用的合并功能。
【讨论】:
添加新记录时的竞态条件如何?【参考方案2】:我已经设法解决了对 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)
【讨论】:
以上是关于Flask-SQLAlchemy:如何有条件地插入或更新一行的主要内容,如果未能解决你的问题,请参考以下文章