python-flask에서 DB와의 커넥션은 엔진을 만들고 이를 바탕으로 session을 가져오는 방식으로 진행한다
# Engine을 통해서 session을 가져온다 Engine = create_engine( ~~~~~) Session= scoped_session(sessionmaker(~~~~~, bind = Engine) #session을 통해서 테이블의 데이터를 가져올 수 있다. session.query(table).all() # 1) 해당 테이블 전체 가져오기 session.query(table).first() # 2) 해당 테이블에서 한줄만 가져오기 # 내가 해당 테이블의 모든 칼럼 정보가 필요로 하다면 위에처럼 가져오는게 맞다. 하지만 특정 칼럼 정보만 필요하다면 session.query(table.column_one).first() # 3) 이런식으로 특정 칼럼을 명시해주는 것이 퍼포먼스 상으로 좋다. # 하지만 만약에 특정 칼럼만 가져와서 데이터 확인 후 이를 업데이트 해야하는 경우가 있다면 위의 3)의 경우를 사용할 수 없다. row = session.query(table).first() # 4) row.column = new_value or setattr(row, column, new_value) # 보통 session으로 가져왔을 경우의 update 방식이다. 이 경우는 table에서 특정 칼럼을 지칭하지 않았다. # 하지만 이럴 경우 위에서 언급했듯이 퍼포먼스의 이슈가 있고 좀더 빠르게 처리하기 위해선 특정 칼럼 가져오기 + update를 해야한다. # 3)에서 했던 방식으로 update를 할 경우.. 즉 row = session.query(table.column).first() # 5) row.column = new_value or setattr(row, column, new_value) # 위 방식으로 할 경우 업데이트가 되지 않는다. # 왜냐하면 4번의 결과값과 5번의 결과값은 확연히 다르기 때문이다. # 4번은 colletion_result이므로 setter가 존재한다. 하지만 5)번은 4번과 모양은 같지만 타입은 tuple에 불과하다. 그렇기에 setter가 존재하지 않는다. # https://stackoverflow.com/questions/51391039/cant-set-attribute-on-result-objects-in-sqlalchemy-flask 를 보면 자세히 알 수 있다. # 그렇다면 특정 칼럼만 가져오면서 update를 할 수 있는 방법은 없을까? # rom sqlalchemy.orm import load_only 를 사용하면 된다. query = session.query(Table).options(load_only("column_one", "column_two")) # 6) # 위 방법은 컬럼을 단 두개만 가져온다. 또한 setter를 가지고 있기에 update를 사용할 수 있다. # 실제 0.76 정도 걸리던 실행시간이 0.40 정도로 줄일 수 있었다.
'파이썬' 카테고리의 다른 글
sqlalchemy) mysql 쿼리문, sqlalchemy 정리) (0) | 2018.10.06 |
---|---|
python.h 그런 파일이나 디렉터리가 없습니다. (0) | 2018.10.02 |
juptyer notebook, async 사용시 event loop 에러 발생할 경우 (0) | 2018.09.30 |
python) datetime 형변환 관련.. (0) | 2018.09.19 |
패키지 설치지 Microsoft c++ require 14.0 에러가 뜰때 (0) | 2018.09.12 |