假设我有一张桌子:
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的工作原理吗?
它要求您依赖 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。