slick slick-3.0

¿Cómo convertir Rep[T] a T en Slick 3.0?



slick-3.0 (1)

Utilicé un código, generado a partir del generador de código pulido.

Mi tabla tiene más de 22 columnas, por lo tanto usa HList

Genera 1 tipo y 1 función:

type AccountRow def AccountRow(uuid: java.util.UUID, providerid: String, email: Option[String], ...):AccountRow

¿Cómo escribo el código de inserción compilado del código generado?

Intenté esto:

val insertAccountQueryCompiled = { def q(uuid:Rep[UUID], providerId:Rep[String], email:Rep[Option[String]], ...) = Account += AccountRow(uuid, providerId, email, ...) Compiled(q _) }

Necesito convertir Rep[T] en T para que funcione la función AccountRow . ¿Cómo puedo hacer eso?

Gracias


; TLDR; Imposible

Explicación

Hay dos niveles de abstracción en Slick: Query s y DBIOAction s.

Cuando se trata de Query , debe acceder a las definiciones de esquema y las filas, Rep y, básicamente, está muy restringido, ya que es el nivel de abstracción más cercano al DB real que está utilizando. Una Rep refiere a un valor hipotético en la base de datos, no en su programa.

Luego tiene DBIOActions, que son el siguiente nivel ... no solo una definición de una consulta, sino su ejecución. Por lo general, obtiene DBIOAction s cuando obtiene información de una consulta, como con el método de result o (TADAN!) Al insertar filas.

Insert y Update s no son consultas y, por lo tanto, no es posible lo que intentas hacer. Estás tratando con DBIOAction (el método += ), y con el tema Query (los tipos de Rep ). La única manera de obtener un Rep dentro de una DBIOAction es ejecutando una Consulta y obteniendo una DBIOAction y luego componiendo ambas Acciones usando flatMap o para las comprensiones (que es lo mismo).