如何使用 Circe 从 Doobie Scala PostgreSQL 数据库中读取 JSON?
How to read JSON out of Doobie Scala PostgreSQL Database with Circe?
我已经尝试创建以下隐式,以便我可以 GET/read 来自 postgreSQL 数据库的数据。我试过添加推荐的隐式函数,但它们变成灰色并且似乎未被使用。
implicit val get: Get[JobPostDetails] =
Get[Json].temap(_.as[JobPostDetails].leftMap(_.show))
def createTable: doobie.Update0 = {
sql"""
|CREATE TABLE IF NOT EXISTS jobs (
| id TEXT PRIMARY KEY,
| details JSON NOT NULL
|)
""".stripMargin
.update
}
case class JobPost(id: String, details: JobPostDetails)
case class JobPostDetails(title: String, description: String, salary: Double, employmentType: String, employer: String)
[warn] insecure HTTP request is deprecated 'http://repo.typesafe.com/typesafe/releases/'; switch to HTTPS or opt-in as ("Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/").withAllowInsecureProtocol(true)
[info] Compiling 1 Scala source to /Users/ryanmcavoy/fullStackRyan/job-board/target/scala-2.13/classes ...
[error] /Users/ryanmcavoy/fullStackRyan/job-board/src/main/scala/io/github/jobboard/model/JobPost.scala:31:44: value leftMap is not a member of io.circe.Decoder.Result[io.github.jobboard.model.JobPostDetails]
[error] Get[Json].temap(_.as[JobPostDetails].leftMap(_.show))
[error] ^
[error] one error found
[error] (Compile / compileIncremental) Compilation failed
[error] Total time: 1 s, completed 3 Sep 2020, 16:41:02
sbt:job-board>
[![enter image description here][1]][1]
[![enter image description here][2]][2]
[1]: https://i.stack.imgur.com/PvKHJ.png
[2]: https://i.stack.imgur.com/9QPz6.png
旧版本的 Scala 提供了 .leftMap
到 Either
(因为这是 Circe Result 的别名),您使用的源代码中可能已经提到了。
然而,较新的版本清理了 API 一点,他们使用 .left
和 .right
来聚合许多方法。所以 .leftMap
变成了 .left.map
,但你也有 .left.flatMap
等,这样你就可以轻松地使用 Either
,而不仅仅是在与 Either 一致的用例中 Right-biased .
长话短说 - 在较新版本的 Scala 中将 .leftMap
替换为 .left.map
。
我已经尝试创建以下隐式,以便我可以 GET/read 来自 postgreSQL 数据库的数据。我试过添加推荐的隐式函数,但它们变成灰色并且似乎未被使用。
implicit val get: Get[JobPostDetails] =
Get[Json].temap(_.as[JobPostDetails].leftMap(_.show))
def createTable: doobie.Update0 = {
sql"""
|CREATE TABLE IF NOT EXISTS jobs (
| id TEXT PRIMARY KEY,
| details JSON NOT NULL
|)
""".stripMargin
.update
}
case class JobPost(id: String, details: JobPostDetails)
case class JobPostDetails(title: String, description: String, salary: Double, employmentType: String, employer: String)
[warn] insecure HTTP request is deprecated 'http://repo.typesafe.com/typesafe/releases/'; switch to HTTPS or opt-in as ("Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/").withAllowInsecureProtocol(true)
[info] Compiling 1 Scala source to /Users/ryanmcavoy/fullStackRyan/job-board/target/scala-2.13/classes ...
[error] /Users/ryanmcavoy/fullStackRyan/job-board/src/main/scala/io/github/jobboard/model/JobPost.scala:31:44: value leftMap is not a member of io.circe.Decoder.Result[io.github.jobboard.model.JobPostDetails]
[error] Get[Json].temap(_.as[JobPostDetails].leftMap(_.show))
[error] ^
[error] one error found
[error] (Compile / compileIncremental) Compilation failed
[error] Total time: 1 s, completed 3 Sep 2020, 16:41:02
sbt:job-board>
[![enter image description here][1]][1]
[![enter image description here][2]][2]
[1]: https://i.stack.imgur.com/PvKHJ.png
[2]: https://i.stack.imgur.com/9QPz6.png
旧版本的 Scala 提供了 .leftMap
到 Either
(因为这是 Circe Result 的别名),您使用的源代码中可能已经提到了。
然而,较新的版本清理了 API 一点,他们使用 .left
和 .right
来聚合许多方法。所以 .leftMap
变成了 .left.map
,但你也有 .left.flatMap
等,这样你就可以轻松地使用 Either
,而不仅仅是在与 Either 一致的用例中 Right-biased .
长话短说 - 在较新版本的 Scala 中将 .leftMap
替换为 .left.map
。