Слишком много аргументов для метода += с кодом, сгенерированным Slick

avatar
mthmulders
8 августа 2021 в 17:31
120
1
0

Я пытаюсь использовать Slick в проекте Scala для доступа к реляционной базе данных (PostgreSQL). В проекте используются Scala 2.12.14, Slick 3.3.3 и Slick Codegen 3.3.3.

Я начал с создания очень простой таблицы базы данных:

create table example (
    id uuid not null primary key,
    name varchar
);

Затем я запустил Slick codegen, чтобы сгенерировать для себя классы Table и TableRow. В результате получается такой файл Scala:

object Tables extends {
  val profile = slick.jdbc.PostgresProfile
} with Tables

/** Slick data model trait for extension, choice of backend or usage in the cake pattern. (Make sure to initialize this late.) */
trait Tables {
  val profile: slick.jdbc.JdbcProfile
  import profile.api._
  import slick.model.ForeignKeyAction
  // NOTE: GetResult mappers for plain SQL are only generated for tables where Slick knows how to map the types of all columns.
  import slick.jdbc.{GetResult => GR}

  /** DDL for all tables. Call .create to execute. */
  lazy val schema: profile.SchemaDescription = Example.schema
  @deprecated("Use .schema instead of .ddl", "3.0")
  def ddl = schema

  /** Entity class storing rows of table Example
   *  @param id Database column id SqlType(uuid), PrimaryKey
   *  @param name Database column name SqlType(varchar), Default(None) */
  case class ExampleRow(id: java.util.UUID, name: Option[String] = None)
  /** GetResult implicit for fetching ExampleRow objects using plain SQL queries */
  implicit def GetResultExampleRow(implicit e0: GR[java.util.UUID], e1: GR[Option[String]]): GR[ExampleRow] = GR{
    prs => import prs._
    ExampleRow.tupled((<<[java.util.UUID], <<?[String]))
  }
  /** Table description of table example. Objects of this class serve as prototypes for rows in queries. */
  class Example(_tableTag: Tag) extends profile.api.Table[ExampleRow](_tableTag, "example") {
    def * = (id, name) <> (ExampleRow.tupled, ExampleRow.unapply)
    /** Maps whole row to an option. Useful for outer joins. */
    def ? = ((Rep.Some(id), name)).shaped.<>({r=>import r._; _1.map(_=> ExampleRow.tupled((_1.get, _2)))}, (_:Any) =>  throw new Exception("Inserting into ? projection not supported."))

    /** Database column id SqlType(uuid), PrimaryKey */
    val id: Rep[java.util.UUID] = column[java.util.UUID]("id", O.PrimaryKey)
    /** Database column name SqlType(varchar), Default(None) */
    val name: Rep[Option[String]] = column[Option[String]]("name", O.Default(None))
  }
  /** Collection-like TableQuery object for table Example */
  lazy val Example = new TableQuery(tag => new Example(tag))
}

Насколько я могу судить, в этом есть смысл.

Затем я попытался использовать эту схему для вставки записи в таблицу "пример":

val config = DatabaseConfig.forURI[JdbcProfile](URI.create("...not relevant..."))
config.db.run(DBIO.seq(
    Tables.Example += (UUID.randomUUID(), "Whatever"),
))

При компиляции этого кода возникает ошибка:

слишком много аргументов (2) для метода +=: (значение: Tables.ExampleRow)slick.sql.FixedSqlAction[Int,slick.dbio.NoStream,slick.dbio.Effect.Write]

Есть идеи?

Источник

Ответы (1)

avatar
Yuriy Tumakha
9 августа 2021 в 15:20
1

Поскольку у вас двунаправленное сопоставление с использованием <> для проекции *

def * = (id, name) <> (ExampleRow.tupled, ExampleRow.unapply)

тогда следующее должно работать

Tables.Example += ExampleRow(UUID.randomUUID(), Some("Whatever")),
mthmulders
9 августа 2021 в 16:52
0

Спасибо за объяснение. Я не нашел ничего об этом в документах, которым я следовал.