首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过Doobie以JSONB格式插入case对象?

如何通过Doobie以JSONB格式插入case对象?
EN

Stack Overflow用户
提问于 2021-06-01 12:52:18
回答 2查看 1.1K关注 0票数 3

我使用Scala2.13和doobie 0.12.1

例如,我有案例类。

代码语言:javascript
复制
case class UserInfo(name: String, age: Int, hobbies: Vector[String])

我希望在列info中插入用户信息作为jsonb。

代码语言:javascript
复制
sql"""
        INSERT INTO users(
            id,
            info
            created_at,
        ) values (
            ${id},
            ${userInfo},
            ${createdAt},
        )
      """.update.run.transact(t)

在我的DAO中,我有隐含的val

代码语言:javascript
复制
implicit val JsonbMeta: Meta[Json] = Meta
.Advanced.other[PGobject]("jsonb")
.timap[Json](jsonStr => parser.parse(jsonStr.getValue).leftMap[Json](err => throw err).merge)(json => {
  val o = new PGobject
  o.setType("jsonb")
  o.setValue(json.noSpaces)
  o
})

但是我有编译异常

代码语言:javascript
复制
found   : ***.****.UserInfo
   [error]  required: doobie.syntax.SqlInterpolator.SingleFragment[_]; incompatible interpolation method sql
    [error]       sql"""
    [error]       ^
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-02 19:46:31

doobie-postgres-circe模块提供pgEncoderPutpgDecoderGet。有了这些,以及范围内的隐式circe EncoderDecoder,您可以创建一个Meta[UserInfo]。那么,您的示例insert应该可以工作。

示例用法:

代码语言:javascript
复制
// Given encoder & decoder (or you could import io.circe.generic.auto._)
implicit encoder: io.circe.Encoder[UserInfo] = ???
implicit decoder: io.circe.Decoder[UserInfo] = ???

import doobie.postgres.circe.jsonb.implicits.{pgDecoderGet, pgEncoderPut}

implicit val meta: Meta[UserInfo] = new Meta(pgDecoderGet, pgEncoderPut)
票数 4
EN

Stack Overflow用户

发布于 2021-06-01 20:00:14

您已经为Json类型定义了一个Json,但是看起来您在插入的字符串中使用了UserInfo实例。尝试将对象转换为Json并将其传递给sql

代码语言:javascript
复制
// This assumes you're using Circe as your JSON library
import io.circe._, io.circe.generic.semiauto._, io.circe.syntax._

implicit val userInfoEncoder: Encoder[UserInfo] = deriveEncoder[UserInfo]

val userInfo: UserInfo = UserInfo("John", 50, Vector("Scala"))
val userInfoJson: Json = userInfo.asJson // requires Encoder[UserInfo]

// and then, assuming that an implicit Meta[Json] is in scope
sql"""INSERT INTO users(
            id,
            info
            created_at,
        ) values (
            ${id},
            ${userInfoJson}, -- instance of Json here
            ${createdAt},
        )"""
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67789229

复制
相关文章

相似问题

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