2014-03-27 2 views
3

세 개의 테이블이 있습니다. 이것들은 ForeignKey 제약에 의해 합쳐 지므로 sqlalchemy는 그것들을 결합하는 방법을 압니다.SELECT의 다중 조인

나는 모든 세 개의 테이블에서 열을 선택합니다 :

이 깨진 SQL을 생성
select([a.c.x, b.c.x, c.c.x], a.c.a.between(10,20), [join(a, c), join(a, b)]) 

:

SELECT a.x, b.x, c.x 
FROM 
    a JOIN b ON a.b_id == b.id, 
    a JOIN c ON a.c_id == c.id 
WHERE 
    a.a BETWEEN 10 AND 20; 
에서 볼 수있는 바와 같이

, 테이블 a 두 번 FROM 절입니다!

select() 문에서 sqlalchemy를 사용하여 세 개의 테이블을 조인 할 수 있습니까?

+0

저는 SQLAlchemy에 익숙하지 않지만 [Queries] (http://docs.sqlalchemy.org/en/rel_0_9/orm/query.html#sqlalchemy.orm.query.Query.join) 대신 – J0HN

답변

0

아래 내용을 참조하십시오.

SELECT a.x, b.x, c.x 
FROM *TABLENAME* a 
JOIN *TABLENAME* b 
ON a.id = b.id 
JOIN *TABLENAME* c 
ON a.id = c.id 
WHERE 
a.a BETWEEN 10 AND 20 
1

짧은 대답은

select([a.c.x, b.c.x, c.c.x]).\ 
     select_from(a.join(b).join(c)).\ 
     where(between(a.c.a, 5, 15)) 

입니다 그리고 누군가의 여기 그것을 밖으로 시도하려는 경우 전부입니다.

import sqlalchemy 
    from sqlalchemy import Table, Column, Integer, String, Sequence,\ 
     ForeignKey, select, between 


    meta = sqlalchemy.MetaData() 
    url = 'sqlite:///:memory:' 
    engine = sqlalchemy.create_engine(url) 


    a = Table(
     'a', meta, 
     Column('id', Integer, Sequence('a_id_seq'), primary_key=True), 
     Column('age', Integer), 
     Column('name', String(20)) 
    ) 

    b = Table(
     'b', meta, 
     Column('a_id', Integer, ForeignKey("a.id")), 
     Column('value', String(20)) 
    ) 

    c = Table(
     'c', meta, 
     Column('a_id', Integer, ForeignKey("a.id")), 
     Column('title', String(20)) 
    ) 

    # Create tables 
    meta.create_all(engine) 

    # Fill with dummy data 
    def add_data(age, name, value, title): 
     q = a.insert().values({a.c.age: age, a.c.name: name}) 
     res = engine.execute(q) 
     a_id = res.inserted_primary_key[0] 

     q = b.insert().values({b.c.a_id: a_id, b.c.value: value}) 
     engine.execute(q) 

     q = c.insert().values({c.c.a_id: a_id, c.c.title: title}) 
     engine.execute(q) 

    add_data(12, 'Foo', 'Bar', 'Baz') 
    add_data(17, '111', '222', '333') 

    q = select([a.c.name, b.c.value, c.c.title]).\ 
     select_from(a.join(b).join(c)).\ 
     where(between(a.c.age, 5, 15)) 

    print(str(q)) 
    # SELECT a.name, b.value, c.title 
    # FROM a JOIN b ON a.id = b.a_id JOIN c ON a.id = c.a_id 
    # WHERE a.age BETWEEN :age_1 AND :age_2 

    res = engine.execute(q) 
    for row in res.fetchall(): 
     print(row) 
     # ('Foo', 'Bar', 'Baz') 

덧글에 대한 답변은 thx입니다. Will!

+0

'FROM a, b, c'는 직교 좌표계의 제품입니다! 'WHERE' 또는'JOIN'이 필요합니다. – Will

+0

아, 완전히 맞습니다. 한 행/테이블 만 놓치기 쉽다. :) 나는 대답을 업데이트했다. 지금 더 나아 졌는지 확인해보기 바란다. – MyGGaN

+0

b와 c가 관계가 있거나 두 테이블 사이에 둘 이상의 관계가있는 경우 어떻게됩니까? – Will