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