问题描述
我正在使用 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
时,您需要 orderIntentItemsSlug
的 ToField
实例(即 orderIntentItemsSlug
)。
这就是你的错误告诉你的。
我建议您查看其他 ToField
instances 的来源以弄清楚您想怎么做(一种骇人听闻的方法是先将您的字段变成 [Text]
,这已经使 {{ 1}} 个实例)。
您还可以编写一个订单表,每次将 Text
与一个项目相关联,然后您根本不必编写任何实例。