2014-02-15 3 views
6

Я следовал (два) примера в этом вопросе: SQLAlchemy: a better way for update with declarative?SQLAlchemy обновления не работает с Sqlite

И я нахожу, что обновление модели не происходит при использовании SQLite с колбой-SQLAlchemy на Ubuntu Linux. Самый простой пример не работает для меня:

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" 

Первый раз с использованием опоки/SQLAlchemy, поэтому я предполагаю, что я что-то очевидное отсутствует.

ответ

12

Так что я попробовал несколько разных вещей. Вот что не работает, и что, наконец, сделали работу:

Не работает:

# 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() 

ли работа:

#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() 
Смежные вопросы