假设表有三列:用户名、密码和no_of_logins。

当用户尝试登录时,它会检查带有类似查询的条目

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

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


当前回答

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

现在您可以像user一样更改新对象变量的值。No_of_logins += 1,并使用会话的commit方法保存更改。

其他回答

user.no_of_logins += 1
session.commit()

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

现在您可以像user一样更改新对象变量的值。No_of_logins += 1,并使用会话的commit方法保存更改。

因为这是谷歌上出现的第一个结果,所以我想分享一种使用SQLAlchemy更新行的更可伸缩的方法。它是基于之前的答案,我目前使用它与一个接口,允许我做table.update(**kwargs)通过我所有的CRUD表。

class User(Base):

    __tablename__ = 'users'

    user_id = Column(Integer, primary_key=True)
    first_name = Column(String)
    last_name = Column(String)

    def __init__(self, first_name: str, last_name: str, user_id: int = None):
        self.firtst_name = first_name
        self.last_name = last_name
        self.user_id = user_id

    def update(self, first_name: str, last_name: str, user_id: int = None, **kwargs):
        self.firtst_name = first_name
        self.last_name = last_name
        self.user_id = user_id
        
    def __repr__(self):
        return self.firtst_name

更新方法内置于ORM表声明本身。这样表就知道该如何更新自己。这可能对将来的UPSERT操作有用。

with new_session() as post_session:
    post_data = request.form.to_dict(flat=False)
    client = Client.query.filter_by(id=post_data["id"]).first()
    client.update(**post_data)
    post_session.add(client)

实际的更新就变得非常简单。从这里进行概括也很容易。

我写电报机器人,有一些问题更新行。 使用这个例子,如果你有模型

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: flush()和commit()之间有什么区别?

有几种使用sqlalchemy进行UPDATE的方法

1) user.no_of_logins += 1
   session.commit()
   
2) session.query(User).\
       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()