11

私は2つのテーブルを持っており、以下beardmoustache定義されています。

+--------+---------+------------+-------------+
| person | beardID | beardStyle | beardLength |
+--------+---------+------------+-------------+

+--------+-------------+----------------+
| person | moustacheID | moustacheStyle |
+--------+-------------+----------------+

PostgreSQLでSQLクエリを作成しました。これは、これら2つのテーブルを組み合わせて、次の結果を生成します。

+--------+---------+------------+-------------+-------------+----------------+
| person | beardID | beardStyle | beardLength | moustacheID | moustacheStyle |
+--------+---------+------------+-------------+-------------+----------------+
| bob    | 1       | rasputin   | 1           |             |                |
+--------+---------+------------+-------------+-------------+----------------+
| bob    | 2       | samson     | 12          |             |                |
+--------+---------+------------+-------------+-------------+----------------+
| bob    |         |            |             | 1           | fu manchu      |
+--------+---------+------------+-------------+-------------+----------------+

クエリ:

SELECT * FROM beards LEFT OUTER JOIN mustaches ON (false) WHERE  person = "bob"
UNION ALL
SELECT * FROM beards b RIGHT OUTER JOIN mustaches ON (false) WHERE  person = "bob"

ただし、SQLAlchemy表現を作成することはできません。from_statement実装からまでいくつかの方法を試しましouterjoinたが、どれも実際には機能しませんでした。誰かがそれを手伝ってくれますか?

4

5 に答える 5

5

@Francis P提案から、私はこのスニペットを思いついた:

q1 = session.\
     query(beard.person.label('person'),
           beard.beardID.label('beardID'),
           beard.beardStyle.label('beardStyle'),
           sqlalchemy.sql.null().label('moustachID'),
           sqlalchemy.sql.null().label('moustachStyle'),
     ).\
     filter(beard.person == 'bob')

q2 = session.\
     query(moustache.person.label('person'),
           sqlalchemy.sql.null().label('beardID'), 
           sqlalchemy.sql.null().label('beardStyle'),
           moustache.moustachID,
           moustache.moustachStyle,
     ).\
     filter(moustache.person == 'bob')

result = q1.union(q2).all()

ただし、これは機能しますが、ハックのように見えるため、回答として呼び出すことはできません。RIGHT OUTER JOINこれがsqlalchemyにあるべきもう1つの理由です。

于 2012-07-10T16:50:41.837 に答える
1

これが私が持っているものです、ORMスタイル:

from sqlalchemy.sql import select, false

stmt = (
    select([Beard, Moustache])
    .select_from(
        outerjoin(Beard, Moustache, false())
    ).apply_labels()
).union_all(
    select([Beard, Moustache])
    .select_from(
        outerjoin(Moustache, Beard, false())
    ).apply_labels()
)

session.query(Beard, Moustache).select_entity_from(stmt)

単独で動作するように見えますが、別の選択式と結合することは不可能のようです

于 2015-02-08T13:32:47.023 に答える