【问题标题】:How to read/write Timestamp in Doobie (Postgres)如何在 Doobie (Postgres) 中读取/写入时间戳
【发布时间】:2020-04-02 21:29:52
【问题描述】:

如何在 Doobie 中读取/写入时间戳?

我有一个包含时间戳字段的记录类。当我尝试将其写入数据库或使用 doobie 读取时,我收到错误Cannot find or construct a Read instance for type

case class ExampleRecord(data: String, created_at: Timestamp)

val create = sql"create table if not exists example_ts (data TEXT NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP)".update.run
val insert = Update[ExampleRecord]("insert into example_ts (data, created_at) values (?, ?)")
  .updateMany(List(
    ExampleRecord("one", Timestamp.valueOf(LocalDateTime.now())),
    ExampleRecord("two", Timestamp.valueOf(LocalDateTime.now()))
  ))
val select = sql"select data, created_at from example_ts".query[ExampleRecord].stream

val app = for {
  _ <- create.transact(xa).compile.drain
  _ <- insert.transact(xa).compile.drain
  _ <- select.transact(xa).compile.drain
} yield ()

app.unsafeRunSync()

【问题讨论】:

  • 你有这个问题吗?我实际上搜索了一段时间如何做到这一点。目前的文档没有说明如何做到这一点。我不得不在官方 doobie gitter 频道询问,他们说它已在最新版本中修复。

标签: postgresql scala doobie


【解决方案1】:

您需要导入doobie.implicits.javasql._doobie.implicits.javatime._ release notes。这是使用 doobie 读取/写入时间戳的完整应用示例。

// sbt
// "org.tpolecat" %% "doobie-core"      % "0.8.8",
// "org.tpolecat" %% "doobie-postgres"  % "0.8.8"


import java.sql.Timestamp
import java.time.LocalDateTime

import doobie._
import doobie.implicits._
import doobie.implicits.javasql._
import doobie.postgres._
import doobie.postgres.implicits._
import doobie.postgres.pgisimplicits._
import cats._
import cats.implicits._
import cats.effect._
import cats.effect.implicits._

case class ExampleRecord(data: String, created_at: Timestamp)

object Example extends IOApp {
  override def run(args: List[String]): IO[ExitCode] = {
    val xa = Transactor.fromDriverManager[IO](
      "org.postgresql.Driver",     // driver classname
      "jdbc:postgresql:example_db",     // connect URL (driver-specific)
      "postgres",                  // user
      ""                          // password
    )

    val drop = sql"drop table if exists example_ts".update.run
    val create =
      sql"create table if not exists example_ts (data TEXT NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP)".update.run
    val insert = Update[ExampleRecord]("insert into example_ts (data, created_at) values (?, ?)")
      .updateMany(List(
        ExampleRecord("one", Timestamp.valueOf(LocalDateTime.now())),
        ExampleRecord("two", Timestamp.valueOf(LocalDateTime.now()))
      ))

    val setup = for {
      _ <- drop.transact(xa)
      _ <- create.transact(xa)
      _ <- insert.transact(xa)
    } yield ()

    val select =
      sql"select data, created_at from example_ts".query[ExampleRecord].stream.transact(xa)

    val output = select.evalTap { record =>
      IO(println(record))
    }.compile.drain

    for {
      _ <- setup
      _ <- output
    } yield ExitCode.Success
  }
}

【讨论】:

    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    相关资源
    最近更新 更多