Yesod persistent-postgresql rawSql 查询带有列列表通配符会产生语法错误
Posted
技术标签:
【中文标题】Yesod persistent-postgresql rawSql 查询带有列列表通配符会产生语法错误【英文标题】:Yesod persistent-postgresql rawSql queries with column-list wildcards producing syntax errors 【发布时间】:2012-10-22 23:03:30 【问题描述】:我正在使用 Yesod 的 persistent-postgresql 库,我想执行以下原始查询:
SELECT * FROM utterance WHERE is_target IS NULL ORDER BY RANDOM() LIMIT 1000
选择 1000 个带有 NULL is_target 的随机话语。但是,当我通过rawSql
运行我的代码时,persistent 会生成以下 SQL:
SELECT * FROM utterance WHERE is_target IS NULL ORDER BY RANDOM() LIMIT 1000"utterance"."id", "utterance"."message", "utterance"."is_target"
这会在 syntax error at or near ""utterance"" at character 77
的 postgresql 中生成错误。
我做错了什么?
【问题讨论】:
看起来它正在尝试扩展您的“选择 *” 恐怕我听不懂。 好吧,为什么你认为它被称为话语? 【参考方案1】:我改用以下查询解决了这个问题:
SELECT ?? FROM utterance WHERE is_target IS NULL ORDER BY RANDOM() LIMIT 1000
【讨论】:
【参考方案2】:rawSql 不适用于列通配符,因为它对返回的数据强制执行强类型,因此它正在尝试(并且失败)找出将列名放在哪里。您需要明确列出列名或使用一些“??”语句中的占位符并在运行时绑定它们,例如,
$ (Entity myType utterance, .... ) -> do ....
如果您不想使用强类型,您可能也不想使用 Persistent;这就是它存在的全部原因。
【讨论】:
我还是不明白。你能给出一个功能代码示例吗?我尝试添加列名SELECT id,message,is_target FROM utterance WHERE is_target IS NULL ORDER BY RANDOM() LIMIT 1000
,但还是不行。
我列出了所有列名,现在我遇到了同样的问题(持久附加一些列名),查询中没有任何通配符。以上是关于Yesod persistent-postgresql rawSql 查询带有列列表通配符会产生语法错误的主要内容,如果未能解决你的问题,请参考以下文章