Câu hỏi Làm thế nào để cập nhật mục nhập SQLAlchemy?


Giả sử bảng có ba cột: username, password và no_of_logins.

Khi người dùng cố gắng đăng nhập, nó được chọn cho một mục có truy vấn như

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

Nếu mật khẩu phù hợp, anh ta tiến xa hơn. Những gì tôi muốn làm là đếm bao nhiêu lần người dùng đăng nhập. Vì vậy, bất cứ khi nào anh ta đăng nhập thành công, tôi muốn tăng no_of_logins và lưu trữ nó trở lại bảng người dùng. Tôi không chắc chắn làm thế nào để chạy truy vấn cập nhật với SqlAlchemy.


75
2018-03-12 12:37


gốc




Các câu trả lời:


user.no_of_logins += 1
session.commit()

74
2018-03-12 12:49



stackoverflow.com/a/2334917/125507 nói đây là một cách xấu để làm điều đó. Còn nếu hàng không tồn tại? - endolith
Theo liên kết của endolith, user.no_of_logins += 1 có thể tạo điều kiện cho cuộc đua. Thay vào đó sử dụng user.no_of_logins = user.no_of_logins + 1. Được dịch thành sql theo cách chính xác sau sẽ trở thành: SET no_of_logins = no_of_logins + 1. - ChaimG
@ChaimG Tôi đoán bạn có nghĩa là user.no_of_logins = User.no_of_logins + 1hoặc nói cách khác là sử dụng thuộc tính được thiết lập của mô hình để tạo ra một biểu thức SQL. Vì nó là bình luận của bạn hiển thị 2 cách để sản xuất cùng một điều kiện chủng tộc. - Ilja Everilä


Có nhiều cách để UPDATE sử dụng 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()

208
2017-11-13 23:02



Câu trả lời này bao gồm tất cả các kịch bản. - Ricardo
tôi sử dụng setattr(query_result, key, value) cho một số cập nhật trong Flask SQLAlchemy theo sau là một cam kết. Bất kỳ lý do để giảm giá mẫu này? - Marc
@datamafia: Bạn có thể sử dụng setattr(query_result, key, value), đó là chính xác tương đương với văn bản query_result.key = value - Nima Soroush
Thx @NimaSoroush, đó là những gì tôi làm và có tương đương. - Marc
Có thể giải thích sự khác biệt giữa các trường hợp này không? Cảm ơn! - Hatshepsut


Với sự giúp đỡ của user=User.query.filter_by(username=form.username.data).first() tuyên bố bạn sẽ nhận được người dùng được chỉ định trong user biến.

Bây giờ bạn có thể thay đổi giá trị của biến đối tượng mới như user.no_of_logins += 1 và lưu các thay đổi với sessionPhương thức commit của.


1
2018-03-12 12:59