5

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 にアップグレードしようとしましたが、まだこの問題が発生しています。これを解決する方法についてのアイデアはありますか?

4

1 に答える 1

2

残念ながら、select_from() が現在実行している 2 つの特定の機能の間には、少し機能的な重複があります。そのうちの 1 つはquery(Task).select_from(<some SELECT statement>)、 と言うことができ、「タスク」を の観点から再配置し<some SELECT statement>ます。最初に FROM に参加する場所です。

http://www.sqlalchemy.org/trac/ticket/2635が追加され、おそらく 0.8 では、この特定のシナリオでより適切な決定を行うことができます。

更新:これについてのレポートをありがとう、私は過去に自分の仕事でもヒットしましたが、掘り下げることができませんでした。それは非常に簡単でした。今のところ 0.8 チップを使用したい場合は、ユース ケースが機能するはずです。

修正の背景は次のとおりです

潜在的な 0.6.8 回避策:

query = session.query(Task.name)

query._from_obj += (baseTask._AliasedClass__alias, )

query = query.join((Task, Task.taskid == baseTask.taskid))
于 2012-12-13T23:18:08.370 に答える