SQLAlchemy 행 항목을 업데이트하는 방법은 무엇입니까?
-
12-12-2019 - |
문제
테이블에 세 개의 열이 있다고 가정합니다. username
, password
그리고 no_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()
?그렇기 때문에 >>> SQLAlchemy:플러시()와 커밋()의 차이점은 무엇입니까?