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 정도로 줄일 수 있었다.

+ Recent posts