【问题标题】:Inserting partial row with slick用光滑插入部分行
【发布时间】:2016-07-14 05:03:16
【问题描述】:

给定:

case class User(id: Long, 
                first: Option[String],
                last: Option[String],
                email: Option[String],
                verified_at: Option[DateTime],
                created_at: DateTime)

class Users(tag: Tag) extends Table[User](tag, "user") {
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
  def firstName = column[Option[String]]("first_name")
  def lastName = column[Option[String]]("last_name")
  def email = column[Option[String]]("email")
  def verifiedAt = column[Option[DateTime]]("verified_at")
  def createdAt = column[DateTime]("created_at")
  def * = (id, firstName, lastName, email, verifiedAt, createdAt) <>(User.tupled, User.unapply)
}

val userQuery = TableQuery[Users]

其中created_at 是 mysql TIMESTAMP(即,如果未在插入 sql 语句中指定,它会自行填充),我想创建一个省略 verified_atcreated_at 的插入。从 Slick 3.0.0 文档中,我收集到这应该可以解决问题:

val insert = userQuery.map(u => (u.first,u.last,u.email))
  += (Some("Bob"), Some("Smith"), Some("bob@smith.com"))

IntelliJ 对这段代码很满意,如果我在地图上执行 insertStatement,我会得到预期的插入语句:

insert into `user` (`first_name`,`last_name`,`email`)  values (?,?,?)

但在编译时我得到:

Error:(30, -1) Play 2 Compiler: 
 C:\proj\test\models\DBTableDefinitionsSpec.scala:30: Adapting argument list by creating a 3-tuple: this may not be what you want.
         signature: SimpleInsertActionComposer.+=(value: U): JdbcActionComponent.this.DriverAction[SimpleInsertActionComposer.this.SingleInsertResult,slick.dbio.NoStream,slick.dbio.Effect.Write]
   given arguments: Some("Bob"), Some("Smith"), Some("bob@smith.com")

请注意,这只是语句准备,甚至与执行无关。这也已经是一个简化版本了——我尝试了与附加的 returning userQuery.map(_.id) 相同的方法,它有相同的错误,所以它似乎与主键无关。

更新:原来是警告变成了错误。我在下面留下了答案,以防其他人遇到这个问题。

【问题讨论】:

  • 我想你在你的 insert val insert = Users.map(u => (u.first,u.last,u.email,u.created_at)) += (Some(" Bob"), Some("Smith"), Some("bob@smith.com"),"{DateTime}")
  • 能否向我们展示您的表定义,以便我们重现您的错误?
  • @aravindKrishna created_at 故意省略,因为我希望 SQL 省略它,以便 mysql 设置时间戳。这就是为什么我使用.map 而不是+= User(...)

标签: scala playframework slick


【解决方案1】:

错误实际上是一个警告。该项目基于一个激活器模板,该模板预定义了许多编译器选项,包括:

"-Xfatal-warnings", // Fail the compilation if there are any warnings.
"-Xlint", // Enable recommended additional warnings.
"-Ywarn-adapted-args", // Warn if an argument list is modified to match the receiver.

虽然删除 -Ywarn-adapted-args 应该可以解决它,但似乎警告会在 2.11 下发出,因为 -Xlint 无论如何

编译器上有一个相关的打勾标记为不会修复:“unit insertion deprecation seems unavoidable in standard slick code

这意味着此时您必须关闭-Xlint-Xfatal-warnings 才能使此代码通过。

【讨论】:

    【解决方案2】:

    在您的user entity 中定义如下所述。

    def creation_at = column[Timestamp]("creation_at",SqlType("timestamp not null default 0")),
    

    如果你在 creation_at 列没有插入,则在写为 0 的表上。

    【讨论】:

    • 问题与created_at 时间戳无关,而是由于编译器警告。删除警告后,它会按预期插入,并且 mysql 根据需要自动填充时间戳
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多