如何更新SQLAlchemy行条目?

时间:2012-03-12 12:37:13

标签: python sqlalchemy flask-sqlalchemy

假设表格有三列:usernamepasswordno_of_logins

当用户尝试登录时,会检查带有

等查询的条目
user=User.query.filter_by(username=form.username.data).first()

如果密码匹配,他继续前进。我想要做的是计算用户登录的次数。因此,每当他成功登录时,我想增加no_of_logins字段并将其存储回用户表。我不确定如何使用SqlAlchemy运行更新查询。

5 个答案:

答案 0 :(得分:264)

使用UPDATE

sqlalchemy有几种方法
1) user.no_of_logins += 1
   session.commit()

2) session.query().\
       filter(User.username == form.username.data).\
       update({"no_of_logins": (User.no_of_logins +1)})
   session.commit()

3) conn = engine.connect()
   stmt = User.update().\
       values(no_of_logins=(User.no_of_logins + 1)).\
       where(User.username == form.username.data)
   conn.execute(stmt)

4) setattr(user, 'no_of_logins', user.no_of_logins+1)
   session.commit()

答案 1 :(得分:98)

user.no_of_logins += 1
session.commit()

答案 2 :(得分:4)

在接受的答案中澄清重要问题的示例

直到我自己玩弄它之前我都不了解它,所以我认为还会有其他人感到困惑。假设您正在为id == 6no_of_logins == 30的用户工作。

# 1 (bad)
user.no_of_logins += 1
# result: UPDATE user SET no_of_logins = 31 WHERE user.id = 6

# 2 (bad)
user.no_of_logins = user.no_of_logins + 1
# result: UPDATE user SET no_of_logins = 31 WHERE user.id = 6

# 3 (bad)
setattr(user, 'no_of_logins', user.no_of_logins + 1)
# result: UPDATE user SET no_of_logins = 31 WHERE user.id = 6

# 4 (ok)
user.no_of_logins = User.no_of_logins + 1
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6

# 5 (ok)
setattr(user, 'no_of_logins', User.no_of_logins + 1)
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6

要点

通过引用类而不是实例,您可以使SQLAlchemy更加智能地进行增量,使其在数据库端而不是Python端发生。在数据库中执行此操作会更好,因为它不容易受到数据损坏的影响(例如,两个客户端尝试同时进行增量操作,而最终结果仅是一次增量而不是两次)。我认为,如果您设置了锁定或提高了隔离级别,则可以在Python中进行增量操作,但是,如果不必这样做,为什么还要麻烦呢?

一个警告

如果要通过产生SET no_of_logins = no_of_logins + 1之类的SQL的代码来增加两次,那么您将需要提交或至少在两次增加之间进行刷新,否则您将总共只能获得一次增加:

# 6 (bad)
user.no_of_logins = User.no_of_logins + 1
user.no_of_logins = User.no_of_logins + 1
session.commit()
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6

# 7 (ok)
user.no_of_logins = User.no_of_logins + 1
session.flush()
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6
user.no_of_logins = User.no_of_logins + 1
session.commit()
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6

答案 3 :(得分:3)

user=User.query.filter_by(username=form.username.data).first()语句的帮助下,您将获得user变量中的指定用户。

现在您可以更改user.no_of_logins += 1等新对象变量的值,并使用session的提交方法保存更改。

答案 4 :(得分:0)

我写了电报bot,并且在更新行时遇到了一些问题。 如果您有模型,请使用此示例

def update_state(chat_id, state):
    try:
        value = Users.query.filter(Users.chat_id == str(chat_id)).first()
        value.state = str(state)
        db.session.flush()
        db.session.commit()
        #db.session.close()
    except:
        print('Error in def update_state')

为什么使用db.session.flush()?这就是为什么>>> SQLAlchemy: What's the difference between flush() and commit()?