문제

테이블에 세 개의 열이 있다고 가정합니다. 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:플러시()와 커밋()의 차이점은 무엇입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top