Flask-SQLAlchemy:如何有条件地插入或更新一行 [英] Flask-SQLAlchemy: How to conditionally insert or update a row

查看:1067
本文介绍了Flask-SQLAlchemy:如何有条件地插入或更新一行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序使用Flask,Flask-SQLAlchemy,Flask-WTF和Jinja2的组合。

在目前的版本中,我有一个设置表。该表只有一个记录和一个字段。最初该表包含零个记录。



我想达到的是:


  • 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 and UPDATE 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆