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 查询带有列列表通配符会产生语法错误的主要内容,如果未能解决你的问题,请参考以下文章

使用持久键列表选择 (Yesod)

Yesod 持久示例

独立于主机名的 Yesod 应用程序

yesod 持久性依赖缺失

Yesod/Persistent 实体派生 Show

将 Yesod 部署到 Heroku,无法静态构建