Mat*_*ren 5 sql alias sqlalchemy self-join
我有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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它在select和join条件下混淆了无别名表和别名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
Run Code Online (Sandbox Code Playgroud)
当我在两个表上使用别名时,它不会混淆它们,结果查询正是我想要的.问题是由于各种原因我不能在我加入的表上使用别名,这是由于应用程序设计中动态生成查询.
我正在使用SQLAlchemy 0.6.8,我试图升级到0.7.9,但我仍然遇到了这个问题.关于如何解决这个问题的任何想法?
不幸的是, select_from() 现在执行的两个特定操作之间存在一些功能重叠,其中之一是您可以说query(Task).select_from(<some SELECT statement>),它将根据 重新定向“任务” <some SELECT statement>,另一个是您可以说它首先从哪里加入。
添加了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))
Run Code Online (Sandbox Code Playgroud)