2012-07-02 34 views
14

Mi aplicación utiliza una combinación de Flask, Flask-SQLAlchemy, Flask-WTF y Jinja2.Flask-SQLAlchemy: cómo insertar o actualizar condicionalmente una fila

En su versión actual, tengo una tabla de configuraciones. La tabla solo tendrá un registro con un campo. Inicialmente, la tabla contiene cero registros.

Lo que quiero lograr es:

  • Dado que no existe ninguna entrada en dB, a continuación, muestran forma vacía listo para la entrada del usuario
  • Teniendo en cuenta que una entrada existe, muestran la entrada, y
  • si el usuario cambia el valor, entonces actualice el rec en db.

Aquí está mi código:

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) 

Tal como está, este código crea un registro si no existe pero la columna rssfeed está vacía.

¿Cómo puedo cambiar este código para que INSERT si el registro no existe y UPDATE si lo hace?

+1

Solo FYI - 'form.validate' debe ser' form.validate() '- una función es siempre cierta, pero su formulario * podría * no pasar la validación. –

+0

¡Gracias por señalar eso! – happygoat

Respuesta

28

Una vez que su forma se valida etc,

Para añadir un nuevo registro:

new_provider = Provider(form.rssfeed.data) 
db.session.add(new_provider) 
db.session.commit() 

Para actualizar un registro existente:

existing_provider = Provider.query.get(1) # or whatever 
# update the rssfeed column 
existing_provider.rssfeed = form.rssfeed.data 
db.session.commit() 

El truco de la actualización es que solo tiene que cambiar el campo en particular y realizar una confirmación. la sesión db se ocupa del resto. Creo que está utilizando la función de fusión que ahora está en desuso en SQLAlchemy.

4

he logrado resolver el problema de hacer estos cambios en el archivo 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) 
Cuestiones relacionadas