使用postgresql-simple的查询字符串的输入错误

时间:2018-06-27 15:58:54

标签: haskell overloaded-strings

关于this question,我有一个使用interpolate包构建的查询模板,然后我试图将其传递给query_ / {{1} } postgresql-simple中的功能。但是编译器拒绝,并显示错误

execute_

文档页面上有关postgresql-simple的值得注意的一段话是:“为了最轻松地构建查询,请启用GHC的 • Couldn't match type ‘[Char]’ with ‘Query’ Expected type: Query Actual type: String 语言扩展,并将查询写为普通的文字字符串。”因此,似乎应该可以进行以下操作:

OverloadedStrings

但是无法编译,如上所述:

{-# LANGUAGE QuasiQuotes       #-}
{-# LANGUAGE OverloadedStrings #-}

import Control.Monad (void)
import Database.PostgreSQL.Simple
import Data.String.Interpolate (i)

-- schema_name.table_name
type Table = String

dropTableIfExistsQuery :: Table -> String
dropTableIfExistsQuery tbl = [i| DROP TABLE IF EXISTS #{tbl} |]

dropTableIfExists :: Connection -> Table -> IO ()
dropTableIfExists conn tbl = void $ execute_ conn $ dropTableIfExistsQuery tbl

有什么作用? • Couldn't match type ‘[Char]’ with ‘Query’ Expected type: Query Actual type: String • In the second argument of ‘($)’, namely ‘dropTableIfExistsQuery tbl’ In the second argument of ‘($)’, namely ‘execute_ conn $ dropTableIfExistsQuery tbl’ In the expression: void $ execute_ conn $ dropTableIfExistsQuery tbl 为什么不在这里工作?

1 个答案:

答案 0 :(得分:1)

OverloadedStrings仅影响字符串文字,而不影响类型String的所有术语。如果您有一个String而不是文字,则可以使用以下方法将其显式转换为IsString的任何实例(例如Query):

fromString :: IsString a => String -> a

我对Query以及您用来说fromString是否具有所需行为的其他库知之甚少;我只声称它具有您需要的类型。