1

我正在尝试解决在使用 django 扩展 djorm-ext-pgfulltext 时执行 sql 子查询时生成的错误。

产生的错误是

对表“bookmarks_bookmark”第 1 行的 FROM 子句条目的无效引用:...ECT U0."id" FROM "bookmarks_bookmark" U0 WHERE (("bookmarks... ”。

产生错误的 django queryset 过滤器是

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

query='html'时生成的sql为:

选择“bookmarks_sharedbookmark”。“id”,“bookmarks_sharedbookmark”。“created”,“bookmarks_sharedbookmark”。“modified”,“bookmarks_sharedbookmark”。“bookmark_id”,“bookmarks_sharedbookmark”。“hot_score”从“bookmarks_sharedbookmark”到“bookmarks_sharedbookmark”。 bookmark_id" IN (SELECT U0."id" FROM U0 WHERE ((U0."search_index") @@ (plainto_tsquery('pg_catalog.english', 'html'))))

根据我的研究,问题可能来自于在 djorm-ext-pgfulltext 中使用 extra() 函数,特别是以下行:

qs = qs.extra(select=select_dict, where=[where], order_by=order)

我已经能够通过强制使用列表评估子查询来解决问题。

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

但是与加载每个元素相关的内存开销在某些时候会令人望而却步。

我想解决不需要太多内存开销的错误。我已经阅读了与使用 extra() 的问题相关的 django 文档及其建议“查看生成的查询并重写您的 where 添加以使用为您的额外表提供的别名”,但我不确定在哪里可以找到正确的别名以及如何编写通常(对于任何搜索词)处理问题的正确 sql。

4

1 回答 1

1

至于你的错误

您的查询中没有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一旦找到第一个匹配项,子查询就可以完成扫描。

于 2013-08-01T17:51:26.573 回答