如何使用 postgresql simple (Haskell) 插入数组?

问题描述

我正在使用 Scotty 和 Postgresql-simple 开发 Haskell API。我无法弄清楚如何插入包含文本数组的列。到目前为止,我的查询已经奏效,但有关此查询的某些内容似乎不能很好地编译。

这就是我所拥有的:

addOrder :: Postgres r m => OrderIntent -> m ()
addOrder param =
  void . withConn $ \conn -> execute conn qry (orderIntentTable param,orderIntentItemsSlug param)
  where
    qry = "insert into orders (table,items,created_at,updated_at) values (?,?,Now(),Now())"

我的 OrderIntent 及其 Fromrow 是:

data OrderIntent = OrderIntent
{ orderIntentTable :: Integer,orderIntentItemsSlug :: [Text] 
} deriving(Eq,Show)

instance Fromrow OrderIntent where
  fromrow = OrderIntent 
    <$> field
    <*> (fromPGArray <$> field)

我得到的错误是:

Could not deduce (Database.Postgresql.Simple.ToField.ToField
                          [Data.Text.Internal.Text])
        arising from a use of ‘execute’
      from the context: Postgres r m
        bound by the type signature for:
                   addOrder :: forall r (m :: * -> *).
                               Postgres r m =>
                               OrderIntent -> m ()
        at Core/Order/DAO.hs:11:1-47

我不知道如何使用 Postgresql 库来解析文本数组,以便将我插入到数据库中。如果你们中有人能帮助我,我将不胜感激!

PS:我也有几天前的 this other blocker,如果您碰巧知道 Scotty auth。

解决方法

使用PGArray

execute conn qry (orderIntentTable param,PGArray (orderIntentItemsSlug param))
,

当您插入 a1>a2 时,您需要 orderIntentItemsSlugToField 实例(即 orderIntentItemsSlug)。 这就是你的错误告诉你的。

我建议您查看其他 ToField instances 的来源以弄清楚您想怎么做(一种骇人听闻的方法是先将您的字段变成 [Text],这已经使 {{ 1}} 个实例)。

您还可以编写一个订单表,每次将 Text 与一个项目相关联,然后您根本不必编写任何实例。