首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Haskell中使用postgresql-simple插入byte值

如何在Haskell中使用postgresql-simple插入byte值
EN

Stack Overflow用户
提问于 2018-09-06 15:40:46
回答 1查看 261关注 0票数 2

我有一个表,定义为

代码语言:javascript
复制
CREATE TABLE users (id SERIAL PRIMARY KEY, val BYTEA);

然后,我想用binary序列化我的数据结构并存储在表中,然后检索并反序列化。

代码语言:javascript
复制
{-# LANGUAGE OverloadedStrings, DeriveAnyClass #-}
import Control.Monad (forM_)
import Data.Binary (encode, decode, Binary)
import Database.PostgreSQL.Simple
import GHC.Generics (Generic)

data User = { name :: Text, email :: Text } deriving (Show, Generic, Binary)
main = do
  conn <- connect --...
  let encoded = encode User {name = "me", email = "me@home.net" }
  execute conn "INSERT INTO users(val) values(?)" $ Only encoded
  rs <- query_ conn "SELECT id, val FROM users"
  forM_ rs $ \(id,val) ->
    putStrLn $ (show (id :: Int)) ++ ": " ++ show (decode val :: User)

但是我得到了错误Data.Binary.Get.runGet at position 0: not enough bytes

查询

代码语言:javascript
复制
SELECT * FROM users;

给出

代码语言:javascript
复制
 id | val 
----+-----
  1 | \x

我想不出如何将ByteString%s映射到“be”。根据docs的说法,一切都应该正常。我哪里做错了?

EN

回答 1

Stack Overflow用户

发布于 2018-09-06 16:04:02

已通过替换行修复

代码语言:javascript
复制
execute conn "INSERT INTO users(val) values(?)" $ Only encoded

使用

代码语言:javascript
复制
execute conn "INSERT INTO users(val) values(?)" $ Only $ Binary encoded

这是因为toField(ByteString)生成Escape,而toField(Binary ByteString)生成EscapeByteA

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52198898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档