我有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,但我仍然遇到了这个问题。关于如何解决这个问题的任何想法?
答案 0 :(得分:2)
不幸的是,select_from()现在正在执行的两个特定事物之间存在一些功能重叠,其中一个就是你可以说query(Task).select_from(<some SELECT statement>)
,它将以{{的方式重新定位“任务” 1}},另一个是你可以告诉它首先加入FROM的位置。
http://www.sqlalchemy.org/trac/ticket/2635,可能在0.8中我们可以通过这种特定方案做出更好的决策。
更新:感谢您对此事的报道,我在过去也曾在自己的工作中点击它,但没有设法深入挖掘,这很简单。如果您现在想要使用0.8提示,那么您的用例应该可以使用。
以下是修补程序的一些背景知识:http://docs.sqlalchemy.org/en/latest/changelog/changelog_08.html#change-8d958f76ee47f7155365772401087d1f
潜在的0.6.8解决方法:
<some SELECT statement>