【发布时间】:2020-01-11 12:52:24
【问题描述】:
我需要使用纯 sql 在 Slick 中进行查询,然后将结果行转换为 db 模型。我无法弄清楚如何将数组 postgres 列(在本例中为字符串数组)转换为 scala 列表。
查询示例
sql"""SELECT n.id, n.created_at, n.values
FROM names n
WHERE n.id = $id""".as[NamesDB])
其中 values 是一个字符串数组。
数据库模型:
case class NamesDB(
id: Long
createdAt: Timestamp,
values: List[String]
)
和表定义:
class Names(tag: Tag) extends Table[NamesDB](tag, "names"){
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def createdAt = column[Timestamp]("created_at")
def values = column[List[String]]("values")
override def * = (
id,
createdAt,
values
) <> ((NamesDB.apply _).tupled, NamesDB.unapply)
}
这行得通,但感觉必须有更好的方法:
implicit val NamesDBRecord = GetResult(r => {
val id = r.nextLong()
val createdAt = r.nextTimestamp()
val values = r.nextString() // "{name1, name2}"
.drop(1).dropRight(1)
.split(",").toList //
NamesDB(id, createdAt, values)
})
我一直在尝试阅读 slick 的源代码,以了解他们如何将 pg 列类型转换为 scala/java 类型,但不清楚在哪里可以找到它。
【问题讨论】:
标签: sql postgresql scala slick implicit