SQLAlchemy とエイリアスに問題があります。Task という名前のテーブルで自己結合を実行しようとしていますが、SQLAlchemy がエイリアス テーブルとエイリアスされていないテーブルを混同します。
私のクエリははるかに複雑ですが、これは簡略化されたバージョンです:
baseTask = aliased(model.Task)
query = model.session.query(model.Task.name)\
.select_from(baseTask)\
.join((model.Task, model.Task.taskid==baseTask.taskid))
The resulting query looks like this:
SELECT task_1.name
FROM task AS task_1 INNER JOIN task ON task_1.taskid = task_1.taskid
ご覧のとおり、選択条件と結合条件の両方で、エイリアスのないテーブルとエイリアスの task_1 を混同しています。
両方のテーブルでエイリアスを使用すると、次のように機能します。
baseTask = aliased(model.Task)
task = aliased(model.Task)
query = model.session.query(task.name)\
.select_from(baseTask)\
.join((task, task.taskid==baseTask.taskid))
This gives the desired result:
SELECT task_1.name
FROM task AS task_2 INNER JOIN task AS task_1 ON task_1.taskid = task_2.taskid
両方のテーブルでエイリアスを使用すると、混乱することはなく、結果のクエリはまさに私が望むものです。問題は、さまざまな理由で、結合するテーブルでエイリアスを使用できないことです。これは、クエリを動的に生成するアプリケーションの設計によるものです。
SQLAlchemy 0.6.8 を使用しており、0.7.9 にアップグレードしようとしましたが、まだこの問題が発生しています。これを解決する方法についてのアイデアはありますか?