我试图解决在使用django扩展名djorm ext pgfulltext执行sql子查询时生成的错误。
生成的错误是
对“bookmarks”表的FROM子句条目的引用无效
第1行:…ECT U0。“id”来自“bookmarks\u bookmark”U0,其中(
(“书签。。。
^提示:也许您想引用表别名“u0”。
生成错误的django queryset过滤器是

shared_bookmarks = SharedBookmark.objects.filter(bookmark__in=Bookmark.objects.search(query))

query='html'时生成的sql是:
选择“书签共享书签”。“id”,“书签共享书签”。“created”,“书签共享书签”。“modified”,“书签共享书签”。“书签id”,“bookmarks\u sharedbookmark”“bookmarks\u sharedbookmark”“hot\u score”“其中”“bookmarks\u sharedbookmark”“bookmark\u id”“IN(从U0 WHERE((U0.“search\u index”)@(plainto\u tsquery('pg\u catalog.english','html'))中选择U0.id”“)”
根据我的研究,问题可能来自于在djorm ext pgfulltext中使用extra()函数,具体如下:
qs = qs.extra(select=select_dict, where=[where], order_by=order)

我已经能够通过强制使用list对子查询求值来解决问题。
SharedBookmark.objects.filter(bookmark__in=list(Bookmark.objects.search(query)))

但是,与加载每个元素相关联的内存开销在某一点上将会令人望而却步。
我想解决不需要太多内存开销的错误。我已经阅读了django文档中有关使用extra()的问题以及它的建议“查看生成的查询并重写where addition以使用给extra table的别名”,但是我不确定在何处可以找到正确的别名,以及如何编写适当的sql(对于任何搜索的术语)来处理问题是。

最佳答案

至于你的错误
查询中没有SELECT U0."id" FROM "bookmarks_bookmark"
一定有什么误会。
至于提出的问题
另一个EXISTS半连接的情况。

SELECT b.id, b.created, b.modified, b.bookmark_id, b.hot_score
FROM   bookmarks_sharedbookmark b
WHERE  EXISTS (
    SELECT 1
    FROM   u0
    WHERE  u0.id = b.bookmark_id
    AND    u0.search_index @@ plainto_tsquery('pg_catalog.english', 'html')
   )

如果您在u0中对bookmarks_sharedbookmark中的一行有多个匹配项,则执行速度会快得多,因为一旦找到第一个匹配项,EXISTS子查询就可以完成扫描。

关于sql - 执行子查询时表别名重新标记,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18000970/

10-11 05:03