[python] sql_alchemy 에서 join을 사용할 때 유의해야 할 사항 - sql_alchemy에 대한 이해
아래와 같이 select의 컬럼과 from의 테이블이 서로 다르다.(사실 이게 되기도 한다)
SELECT distinct kibanaauth_esidx.esidx
FROM kibanaauth_role role
이전 쿼리는 kibanaauth_role와 kibanaauth_esidx가 다르기 때문에 조인을 할 수 없다.
sql_alchemy의 query()를 join()과 함께 쓸 때는
내부적으로 SQL의 select와 from 뒤에 query() 매개 변수에 포함되는 모델의 테이블을 무조건 적용하게 된다.
그래서 아래와 같이 select와 from을 동일한 테이블이 나오도록 쿼리를 수정한 후,,
SELECT DISTINCT kibanaauth_esidx.esidx AS kibanaauth_esidx_esidx
FROM kibanaauth_esidx
아래와 같이 sql_alchemy 문을 만들어서 테스트해보니. 조인이 된다.
aaa = session.query(LogAuthServiceTag.esidx).distinct() \
.join(LogAuthRoleServiceTag, LogAuthServiceTag.id == LogAuthRoleServiceTag.esidx_id) \
.join(LogAuthRole, LogAuthRole.id == LogAuthRoleServiceTag.role_id) \
.join(LogAuthRoleUser, LogAuthRoleUser.role_id == LogAuthRole.id) \
.join(LogAuthUser, LogAuthUser.id == LogAuthRoleUser.user_id) \
.filter(LogAuthUser.userid == userid)
query() 문에 여러 모델을 넣어도 sql_alchemy가 내부적으로 조합하기 때문에
상황에 따라서는 from이 이상하게 나올 수 있다.
복잡하게 sql_alchemy 를 사용할 때는 SQL 문장을 디버깅하면서 확인해야 한다.
다시 얘기하면.
session.query(Post) \
.join(User, Post.author_id == User.id)
이 문장은 다음과 같이 변환될 것이다. query()의 매개 변수는 select, from으로 넘어갔다(항상 그런 것은 아니지만, 대개 그렇다.)
select post
from post
inner join user
on post.author_id == user.id