假设表有三列: username, passwordno_of_logins.

当用户尝试登录时,系统会检查是否存在带有以下查询的条目

user = User.query.filter_by(username=form.username.data).first()

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

有帮助吗?

解决方案

user.no_of_logins += 1
session.commit()

其他提示

有几种方法可以 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()

澄清已接受答案评论中重要问题的示例

直到我自己尝试了一下才明白它,所以我想其他人也会感到困惑。假设您正在处理的用户 id == 6 以及谁的 no_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 中进行递增,但如果您不需要这样做,为什么还要麻烦呢?

一个警告

如果您要通过生成 SQL 的代码递增两次,例如 SET no_of_logins = no_of_logins + 1, ,那么您将需要在增量之间提交或至少刷新,否则您总共只会获得一个增量:

# 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

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

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

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

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()?这就是为什么>>> SQL炼金术:lush() 和 commit() 有什么区别?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top