2012-03-12 2 views
64

테이블에 username, passwordno_of_logins의 세 열이 있다고 가정합니다. 암호 일치, 그는 더 진행하면 SQLAlchemy 행 항목을 업데이트하는 방법은 무엇입니까?

사용자가 로그인을 시도

, 그것은

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

같은 쿼리 항목을 검사합니다. 내가 무엇을하고 싶은지는 사용자가 로그인 한 횟수를 세는 것입니다. 따라서 그가 성공적으로 로그인 할 때마다 no_of_logins 필드를 증가시키고이를 사용자 테이블에 다시 저장하고 싶습니다. SqlAlchemy로 업데이트 쿼리를 실행하는 방법을 모르겠습니다. 당신이 user 변수에 지정된 사용자를 얻을 것이다 user=User.query.filter_by(username=form.username.data).first() 문의 도움으로

답변

65
user.no_of_logins += 1 
session.commit() 
+5

http://stackoverflow.com/a/2334917/125507이 그것을 할 나쁜 방법이다라고 사용 UPDATE하는 방법은 여러 가지가 있습니다. 행이 아직 존재하지 않는다면 어떻게 될까요? – endolith

+2

endolith의 링크마다 'user.no_of_logins + = 1'은 경쟁 조건을 생성 할 수 있습니다. 대신'user.no_of_logins = user.no_of_logins + 1'을 사용하십시오. sql로 변환하면 후자의 올바른 방법이됩니다 :'SET no_of_logins = no_of_logins + 1'. – ChaimG

+0

@ChaimG'user.no_of_logins = User.no_of_logins + 1'을 의미하거나 다른 말로 모델의 인스트루먼트 된 속성을 사용하여 SQL 표현식을 생성합니다. 그것은 귀하의 의견대로 동일한 경쟁 조건을 생산하는 두 가지 방법을 표시합니다. –

1

.

user.no_of_logins += 1과 같은 새 개체 변수의 값을 변경하고 session의 커밋 방법으로 변경 사항을 저장할 수 있습니다.

169

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() 
+3

이 답변은 모든 시나리오를 다룹니다. – Ricardo

+1

플라스크 SQLAlchemy에서 커밋을 한 후 몇 가지 업데이트를 위해'''setattr (query_result, key, value)'''를 사용합니다. 이 패턴을 할인해야하는 이유는 무엇입니까? –

+1

@ datamafia :'setattr (query_result, key, value)'를 사용할 수 있습니다. 이것은'query_result.key = value'를 쓰는 것과 정확히 같습니다. –

관련 문제