아래와 같이 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
'python' 카테고리의 다른 글
[python] jinja2.exceptions.UndefinedError: 'len' is undefined 해결하기 (0) | 2018.03.27 |
---|---|
[python] 테스크 코드 실행 - tox 이용 (0) | 2018.02.23 |
[sql_alchemy] 3개의 테이블 조인 (join three tables) 예제 (0) | 2018.02.21 |
[python] sql_alchemy sql 출력하기 (sql 디버그) (0) | 2018.02.21 |
[flask] AssertionError: View function mapping is overwriting an existing endpoint function 해결하기 (0) | 2018.02.20 |