我正在尝试解决在使用 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。