Flask更新查询

时间:2017-06-01 13:28:40

标签: python sqlalchemy

在我的Flask网络应用程序中,我有一个登录系统。当用户登录时,在我的数据库表中,我想更新用户上次登录时的日期时间。 我正在使用此代码:

 @app.route('/login', methods=['POST'])
 def do_admin_login():
     POST_CODICE_FISCALE = str(request.form['codice_fiscale'])
     POST_PASSWORD = str(request.form['password'])
     pwd_enc=base64.b64encode(POST_PASSWORD)

     Session = sessionmaker(bind=engine)
     s = Session()
     query = s.query(User).filter(User.codice_fiscale.in_([POST_CODICE_FISCALE]), User.password.in_([pwd_enc]))
     result = query.first()
     if result:
        session['logged_in'] = True
        query = s.query(User).filter(User.codice_fiscale.in_([POST_CODICE_FISCALE]).update(User.data_ora_ultimo_accesso=datetime.now()))  
        query.first()
        db.session.commit()
    else:
        flash('wrong password!')
    return home()

但我收到错误:

 query = s.query(User).filter(User.codice_fiscale.in_([POST_CODICE_FISCALE]).update(User.
 data_ora_ultimo_accesso=datetime.now())) 
 SyntaxError: keyword can't be an expression

这是错的? 感谢。

1 个答案:

答案 0 :(得分:1)

如错误所示,函数调用参数列表中的关键字不能是表达式,例如User.data_ora_ultimo_accesso,而是identifier。相反,您应该传递Query.update()列,表达对的字典:

    query = s.query(User).\
        filter(User.codice_fiscale.in_([POST_CODICE_FISCALE]).\
        update({ User.data_ora_ultimo_accesso: datetime.now() },
               synchronize_session=False))

请注意,由于您立即提交,因此无需同步会话,因为无论如何所有州都将过期。

您还可以进行一些更改,以提高代码的可读性。例如,而不是

filter(User.codice_fiscale.in_([POST_CODICE_FISCALE]),
       User.password.in_([pwd_enc]))

filter(User.codice_fiscale == POST_CODICE_FISCALE,
       User.password == pwd_enc)

与仅测试相等性相比,检查1项的列表是否包含某些内容毫无意义。

最后,您创建了一个新的Session类及其实例s,但您提交了一个不同的会话:db.session,您可能已经使用了所有会话沿。这意味着您的更新不会发生,因为该会话的交易实际上没有提交。