sqlalchemy:选择引用别名表名

时间:2016-03-11 03:28:48

标签: python postgresql sqlalchemy

我使用sqlalchemy相当新,并且在生成我正在寻找的sql代码时遇到了一些问题。

最后,我尝试使用以下SQL查询将 table2 的两个不同子集连接到 table1

SELECT table1.date, a1.id AS name1_id, a2.id AS name2_id
FROM table1
LEFT JOIN table2 as a1
    ON table1.name1 = table2.label AND table2.lookup_id = 1000
LEFT JOIN table2 as a2
    ON table1.name2 = table2.label AND table2.lookup_id = 2000

到目前为止,我使用的是sqlalchemy:

q_generate = (
select([table1.c.date,
        a1.id.label('name1_id'),
        a2.id.label('name2_id')])

.select_from(table1
    .outerjoin(table2.alias(name='a1'),
               and_(
                    table2.c.lookup_id == 1000,
                    table1.c.name1 == table2.c.label
                    ))
    .outerjoin(table2.alias(name='a2'),
               and_(
                    table2.c.lookup_id == 2000,
                    table1.c.name2== table2.c.label
                    ))
    )

)

会产生以下错误:

*NameError: name 'a1' is not defined*

是否有必须引用别名表名的特殊方法?我在这里错过了什么?我认为这个错误与这些行有关,但我无法弄清楚如何才能使其发挥作用:

...
a1.id.label('name1_id'),
a2.id.label('name2_id')])
...

谢谢!

1 个答案:

答案 0 :(得分:0)

是的,这样做:

a1 = table2.alias(name='a1')
a2 = table2.alias(name='a2')
q_generate = (
    select([table1.c.date,
            a1.c.id.label('name1_id'),
            a2.c.id.label('name2_id')])
    .select_from(table1.outerjoin(a1, ...).outerjoin(a2, ...)))