gpt4 book ai didi

sql - Slick 中的纯 SQL - 如何将 postgres 数组列映射到列表?

转载 作者:行者123 更新时间:2023-11-29 13:08:37 25 4
gpt4 key购买 nike

我需要使用纯 sql 在 Slick 中进行查询,然后将结果行转换为数据库模型。我无法弄清楚如何将数组 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 类型,但不清楚在哪里可以找到它。

最佳答案

尝试使用https://github.com/tminglei/slick-pg

import java.sql.Timestamp
import com.github.tminglei.slickpg._

trait MyPostgresProfile extends ExPostgresProfile with PgArraySupport {

override val api = MyAPI

object MyAPI extends API with ArrayImplicits
}

object MyPostgresProfile extends MyPostgresProfile

import MyPostgresProfile.api._

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)
}

libraryDependencies += "com.github.tminglei"%% "slick-pg"% "0.18.0"

对于普通的 sql 试试

implicit val strList = GetResult[List[String]] (
r => (1 to r.numColumns).map(_ => r.nextString()).toList
)
implicit val NamesDBRecord = GetResult(r => NamesDB(r.<<, r.<<, r.<<))

sql"""SELECT n.id, n.created_at, n.values
FROM names n
WHERE n.id = $id""".as[NamesDB]

关于sql - Slick 中的纯 SQL - 如何将 postgres 数组列映射到列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57859360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com