Yesod使用列列表通配符生成语法错误的持久postgresql rawSql查询

Yesod使用列列表通配符生成语法错误的持久postgresql rawSql查询,postgresql,haskell,persistent,yesod,Postgresql,Haskell,Persistent,Yesod,我正在使用YesSOD中的持久化postgresql库,我想执行以下原始查询: SELECT * FROM utterance WHERE is_target IS NULL ORDER BY RANDOM() LIMIT 1000 选择1000个带有空值的随机语句是_目标。但是,当我通过rawSql运行代码时,persistent会生成以下SQL: SELECT * FROM utterance WHERE is_target IS NULL ORDER BY RANDOM() LIMIT

我正在使用YesSOD中的持久化postgresql库,我想执行以下原始查询:

SELECT * FROM utterance WHERE is_target IS NULL ORDER BY RANDOM() LIMIT 1000
选择1000个带有空值的随机语句是_目标。但是,当我通过
rawSql
运行代码时,persistent会生成以下SQL:

SELECT * FROM utterance WHERE is_target IS NULL ORDER BY RANDOM() LIMIT 1000"utterance"."id", "utterance"."message", "utterance"."is_target"
这会在postgresql中生成一个错误,即字符77处的“话语”处或附近出现语法错误


我做错了什么?

rawSql不使用列通配符,因为它对返回的数据强制执行强类型,所以它试图(但失败)找出将列名放在何处。您需要在语句中显式列出列名或使用一定数量的“?”占位符,并在运行时像

$ (Entity myType utterance, .... ) -> do ....

如果您不想使用强类型,您可能也不想使用持久性;这就是它存在的全部原因。

我通过使用以下查询解决了这个问题:

SELECT ?? FROM utterance WHERE is_target IS NULL ORDER BY RANDOM() LIMIT 1000

它看起来像是在扩展你的“选择*”,恐怕我不明白。好吧,你为什么认为它叫话语?我还是不明白。你能给出一个函数代码的例子吗?我尝试添加列名
SELECT id,message,is_target FROM话语,其中is_target为NULL ORDER BY RANDOM()LIMIT 1000
,但仍然不起作用。我列出了所有列名,现在我遇到了相同的问题(持久性地追加一些列名),查询中没有任何通配符。