허용 된 답변의 주석에서 중요한 문제를 명확히하는 예
나는 그것을 가지고 놀 때까지 그것을 이해하지 못했기 때문에 혼란스러워하는 다른 사람들도있을 것이라고 생각했습니다. 시작한 사람 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가 증가하는 것에 대해 더 똑똑 해져서 파이썬 쪽이 아닌 데이터베이스 쪽에서 발생할 수 있습니다. 데이터 손상에 덜 취약하기 때문에 데이터베이스 내에서 수행하는 것이 좋습니다 (예 : 두 클라이언트가 동시에 두 개가 아닌 한 번만 순 결과로 증가하려고 시도 함). 잠금을 설정하거나 격리 수준을 높이면 파이썬에서 증분을 수행 할 수 있다고 가정하지만 필요하지 않은 이유는 무엇입니까?
경고
SQL과 같은 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