从表中访问数据库列名?

Mer*_*ith 8 scala slick

假设我有一张桌子:

object Suppliers extends Table[(Int, String, String, String)]("SUPPLIERS") {
  def id = column[Int]("SUP_ID", O.PrimaryKey)
  def name = column[String]("SUP_NAME")
  def state = column[String]("STATE")
  def zip = column[String]("ZIP")
  def * = id ~ name ~ state ~ zip
}
Run Code Online (Sandbox Code Playgroud)

表的数据库名称

可以通过以下方式访问表的数据库名称:Suppliers.tableName
这是由AbstractTable上Scaladoc支持的.

例如,上表的数据库名称是"SUPPLIERS".

列的数据库名称

翻翻AbstractTable,getLinearizedNodes并且indexes看起来前途无量.但是,字符串表示中没有列名称.

我认为*表示"我通常感兴趣的所有列." *是一个MappedProjection,它有这个签名:

final case class MappedProjection[T, P <: Product](
  child: Node, 
  f: (P) ? T, 
  g: (T) ? Option[P])(proj: Projection[P]) 
extends ColumnBase[T] with UnaryNode with Product with Serializable
Run Code Online (Sandbox Code Playgroud)

*.getLinearizedNodes 包含一个庞大的数字序列,我意识到在这一点上,我只是在对API中的所有内容进行强力检查,以便可能在字符串中找到列名.

有没有人之前也遇到过这个问题,或者有人能让我更好地了解MappedProjection的工作原理吗?

cvo*_*ogt 3

它要求您依赖 Slick 内部结构,这可能会在版本之间发生变化,但这是可能的。以下是 Slick 1.0.1 的工作原理:您必须通过FieldSymbol. 然后你就可以像如何提取你想要的信息了columnInfo(driver: JdbcDriver, column: FieldSymbol): ColumnInfo

要从 a 获取FieldSymbola,Column您可以使用fieldSym(node: Node): Option[FieldSymbol]and fieldSym(column: Column[_]): FieldSymbol