Postgresql 如何在准QSQL查询代码中将表名作为变量传递?

Postgresql 如何在准QSQL查询代码中将表名作为变量传递?,postgresql,haskell,Postgresql,Haskell,我正在尝试编写一些通用的Haskell代码,以便使用库将行插入多个Postgresql表中 我无法获取一个变量来替代表名。下面是一些示例代码,说明了错误: {-# LANGUAGE QuasiQuotes, ScopedTypeVariables, OverloadedStrings #-} module Main where import Data.Functor.Identity import Control.Exception import qu

我正在尝试编写一些通用的Haskell代码,以便使用库将行插入多个Postgresql表中

我无法获取一个变量来替代表名。下面是一些示例代码,说明了错误:

{-# LANGUAGE QuasiQuotes, ScopedTypeVariables, OverloadedStrings #-}
module Main where

import           Data.Functor.Identity
import           Control.Exception

import qualified Data.Text             as T

import qualified Hasql.Postgres        as HP
import qualified Hasql                 as H

doit pool = do
  r <- H.session pool $ do
         let kName = "Rob" :: T.Text
             vValue = 34 :: Int
             tName = "t" :: String
         H.tx (Just (H.Serializable, (Just True))) $ do
           H.unitEx $
             [H.stmt| INSERT INTO $tName (name, age) VALUES (?, ?) |] kName vValue
  print r

main = do
  let
    dbConnStr = "dbname=testdb host=pg user=testuser password=password port=5432"
    pgSettings = HP.StringSettings dbConnStr
  poolSettings <- maybe (fail "Improper session settings") return $
                  H.poolSettings 8 30
  bracket (H.acquirePool pgSettings poolSettings :: IO (H.Pool HP.Postgres))
          H.releasePool
          (doit)
在数据库日志中,出现以下错误:

pg_1       | ERROR:  syntax error at or near "$1" at character 13
pg_1       | STATEMENT:  INSERT INTO $1 (name, age) VALUES ($2, $3)

在程序中,如果我将
$tName
替换为
t
,查询将正常进行。这是否意味着无法使用
Hasql
库从变量加载表名?

可能是上下文无关,但您是否尝试过
[H.stmt|INSERT INTO?(name,age)VALUES(?,)|]tName kName vValue]
。@EarlGray是的,我尝试过;它产生与
$tName
完全相同的行为。可能是断章取义,但您是否尝试
[H.stmt|INSERT INTO?(name,age)VALUES(?,)|]tName kName vValue]
?@EarlGray是的,我尝试过;它产生与
$tName
完全相同的行为。
pg_1       | ERROR:  syntax error at or near "$1" at character 13
pg_1       | STATEMENT:  INSERT INTO $1 (name, age) VALUES ($2, $3)