La actualización de SqlAlchemy no funciona con Sqlite

Seguí los (dos) ejemplos en esta pregunta: SQLAlchemy: ¿una mejor manera de actualizar con declarativo?

Y me doy cuenta de que no se produce una actualización del modelo cuando se usa sqlite con matraz-sqlalchemy en Ubuntu Linux. El ejemplo más simple no funciona para mí:

class Task:
    id= db.Column(db.Integer, primary_key=True)
    name= db.Column(db.String(32), unique=True)
    desc= db.Column(db.String(255), unique=False)
    state= db.Column(db.Boolean)

    # ...

@app.route("/task/<int:id>/update",methods=["POST"])
def toggle_state(id):
    db.session.query(Task).get(id).update({"state":True})
    log.info("state is now: " + str(Task.query.get(id).state))
    # prints "state is now: False"

Primera vez que uso matraz/sqlalchemy, así que supongo que me estoy perdiendo algo obvio.

preguntado el 15 de febrero de 14 a las 20:02

1 Respuestas

Así que probé varias cosas diferentes. Esto es lo que no funcionó y lo que finalmente funcionó:

No funcionó:

# this will throw an exception, "AttributeError: 'Task' object has no attribute 'update'"
db.session.query(Task).get(id).update({"state":state})
db.session.commit()

# this was the example in the linked SO thread:
# does nothing
db.session.query(Task).filter_by(id=id).update({"state":state})

#this also does nothing
task = Task.query.filter_by(id=id)
task.state = state
db.session.commit()

#not this either
task = Task.query.get(id)
task.state = state
db.session.commit()

Funcionó:

#ok this works:
db.session.query(Task).filter_by(id=id).update({"state":state})
db.session.commit()

#and also this:
task = db.session.query(Task).get(id)
task.state = state
db.session.commit()

Respondido 14 Oct 17, 02:10

Para estilo declarativo: session.query(Task).filter_by(id=id).update({"state":state}) - Anciano Druida

¿Alguien puede explicar por qué? - Hritik

Estoy enfrentando el mismo problema, es muy raro. - KA

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.