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

How to insert array using 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 库来解析文本数组,以便将 i 插入到数据库中。如果你们中有人能帮助我,我将不胜感激!

PS:我也有 几天前的,如果你碰巧知道 Scotty auth。

在插入 orderIntentItemsSlug 时,您需要 orderIntentItemsSlugToField 实例(即 [Text])。 这就是你的错误告诉你的。

我建议查看其他 ToField instances 的来源以弄清楚你想怎么做(一个 hacky 方法是先把你的字段变成 Text,它已经加气了ToField 个实例)。

您也可以写一个订单 table,一次将 orderID 关联到一个项目,这样您就根本不需要写任何实例了。

使用PGArray.

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