2022-09-07 20:01:05

SQLAlchemy에서 SQL 문을 직접 작성하여 데이터를 조회할 때 다음과 같은 방식을 취할 수 있습니다. 최근 회원 가입한 5명 유저의 이름을 조회해야 하는 상황을 가정하고 아래 쿼리를 작성했습니다. 

 

result = engine.execute('SELECT name FROM user ORDER BY idx LIMIT 5;')

user_names = result.fetchall()

 

이렇게 해주면 user_names에는 유저의 이름이 튜플의 리스트로 다음과 같은 형태로 들어가 있습니다.

 

[('개똥이',), ('말똥이',), ('소똥이',), ('닭똥이',), ('양똥이',)]

 

만약 이 중에서 "개똥이"만 선택하고 싶다면, user_names[0][0] 과 같이 인덱싱 해주면 됩니다. 

 

그런데 직관적으로 봤을 때 result를 print 하면 거기에 데이터가 있을 것 같은데 그렇지 않습니다. result를 print 해보면 다음과 같은 내용이 콘솔에 출력됩니다. 주소 같은 것이 나오는 걸로 봐서 뭔가 포인터 같은 느낌이죠. 

 

 

이렇게 출력되는 친구에게 result[0] 이런 식으로 인덱싱을 시도하면, 오류가 납니다. 다음과 같이 말이죠.

 

 

LegacyCursorResult 객체는 subscriptable이 아니라고 합니다. 제 경험상 이런 에러가 뜨는 것들은 인덱싱이나 슬라이싱 지원이 안되는 객체들입니다. 

 

아무튼 정리하자면 fetchall() 메소드를 사용해야 데이터 조회한 결과를 얻을 수 있다는 것입니다.