如何解决如何通过 Doobie 将 case 对象插入为 JSONB 格式?
我使用 Scala 2.13 和 doobie 0.12.1
例如, 我有案例课
case class UserInfo(name: String,age: Int,hobbies: Vector[String])
我想在列信息中插入用户信息作为 jsonb
sql"""
INSERT INTO users(
id,info
created_at,) values (
${id},${userInfo},${createdAt},)
""".update.run.transact(t)
在我的 DAO 中,我有隐含的 val
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
})
但是我有编译异常
found : ***.****.UserInfo
[error] required: doobie.syntax.SqlInterpolator.SingleFragment[_]; incompatible interpolation method sql
[error] sql"""
[error] ^
解决方法
您已经为 from typing import Any,Dict
class Configuration:
banks: Dict[str,Bank]
def __init__(self,**kwargs: Any) -> None:
self.banks = {}
for bank in kwargs['banks']:
self.add_bank(bank['name'],bank)
def add_bank(self,name: str,bank: Bank) -> None:
self.banks[name] = Bank(**bank)
def get_bank(self,name: str) -> Bank:
return self.banks[name]
类型定义了一个 Meta
,但看起来您在插值字符串中使用了 Json
的实例。尝试将对象转换为 UserInfo
并将其传递给 Json
:
sql
,
doobie-postgres-circe module 提供 pgEncoderPut
和 pgDecoderGet
。有了这些,以及范围内的隐式圆 Encoder
和 Decoder
,您可以创建一个 Meta[UserInfo]
。那么您的示例插入应该可以工作。
示例用法:
// 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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。