【问题标题】:Slick: could not find implicit value for parameter e: slick.jdbc.SetParameter[Option[java.util.UUID]]Slick:找不到参数 e 的隐式值:slick.jdbc.SetParameter[Option[java.util.UUID]]
【发布时间】:2017-02-20 10:21:05
【问题描述】:

我正在使用 Play! 2.5、Slick 3 和 PostgreSQL 9.6。

我正在尝试使用带有可选UUID 的简单普通SQL 查询,但我收到此错误:

Slick: could not find implicit value for parameter e: slick.jdbc.SetParameter[Option[java.util.UUID]]

我的案例类看起来像

final case class GaClientId(ip: String, userId: Option[UUID], clientId: String)

我的查询是这样的:

db.run(       
  sql"""
    INSERT INTO ga_client_id(ip, user_id, clientId) VALUES (
    ${gaClientId.ip}, ${gaClientId.userId}, $gaClientId.userId.orNull)
    ON CONFLICT DO NOTHING;""")

我尝试添加这个:

implicit val getUUIDContent: GetResult[GaClientId] =
  GetResult(r => GaClientId(r.<<, r.nextStringOption().map(UUID.fromString), r.<<))

但没有结果。

我该怎么做?

【问题讨论】:

    标签: postgresql scala slick


    【解决方案1】:

    正如错误所暗示的,您应该指定SetParameter 而不是GetParameter。应该是这样的:

      implicit val uuidSetter = SetParameter[Option[UUID]] {
        case (Some(uuid), params) => params.setString(uuid.toString)
        case (None, params) => params.setNull(Types.VARCHAR)
      }
    

    然后您可能应该将asUpdate 添加到您的更新SQL

      db.run((sql"""
          INSERT INTO ga_client_id(ip, user_id, clientId) VALUES (
          ${gaClientId.ip}, ${gaClientId.userId}, ${gaClientId.clientId})
          ON CONFLICT DO NOTHING;
      """).asUpdate)
    

    【讨论】:

    • 它可以编译,但我必须将 VARCHAR 转换为 UUID,以免出现 PostgreSQL 错误(使用 ${gaClientId.userId}::uuid)。我怀疑有一种方法可以在没有 do uuid to varchar tp uuid 的情况下做到这一点,但我没有找到。
    • 所以您是说您将 UUID 作为 DB 中的一种字段类型?
    • 是的,完全正确(对不起,如果我的问题不清楚)
    猜你喜欢
    • 1970-01-01
    • 2016-03-31
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 2016-01-17
    • 2011-10-17
    相关资源
    最近更新 更多