8

テーブルがあるとしましょう:

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
}

テーブルのデータベース名

テーブルのデータベース名には次のようにアクセスできます: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

*.getLinearizedNodesには膨大な数のシーケンスが含まれており、この時点で、ストリング内の列名を検索するために、API 内のすべてを力ずくで検査しているだけであることに気付きました。

以前にこの問題に遭遇した人はいますか、または MappedProjection がどのように機能するかをよりよく理解できる人はいますか?

4

3 に答える 3

3

バージョン間で変更される可能性がある Slick 内部に依存する必要がありますが、それは可能です。Slick 1.0.1 での動作は次のとおりですFieldSymbol。次に、必要な情報をどのように抽出するかを選択できますcolumnInfo(driver: JdbcDriver, column: FieldSymbol): ColumnInfo

FieldSymbolaから aを取得するには、とColumnを使用できます。fieldSym(node: Node): Option[FieldSymbol]fieldSym(column: Column[_]): FieldSymbol

于 2013-11-15T11:42:41.637 に答える
2

(修飾された) 列名を取得するには、次のようにします。

Suppliers.id.toString
Suppliers.name.toString
Suppliers.state.toString
Suppliers.zip.toString

が列名を生成することはどこにも明示的に述べられていないtoStringため、質問は有効です。


ここで、すべての列名をプログラムで取得したい場合、それは少し難しくなります。リフレクションを使用して、 a を返し、それらColumn[_]を呼び出すすべてのメソッドを取得することもできtoStringますが、エレガントではありません。または、少しハックして、select *次のようなクエリから SQL ステートメントを取得することもできます。

val selectStatement = DB withSession {
  Query(Suppliers).selectStatement
}

次に、列名を解析します。

これは私ができる最善のことです。誰かがより良い方法を知っている場合は、共有してください-私も興味があります;)

于 2013-11-15T01:40:45.293 に答える