用光滑插入部分行

时间:2016-07-14 05:03:17

标签: scala playframework slick

假设:

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(即如果未在insert sql语句中指定,它会自行填充),我想创建一个省略verified_at和{{1}的插入}}。从Slick 3.0.0文档我收集到这应该可以解决问题:

created_at

IntelliJ对此代码感到满意,如果我在地图上执行val insert = userQuery.map(u => (u.first,u.last,u.email)) += (Some("Bob"), Some("Smith"), Some("bob@smith.com")) ,我会得到预期的插入语句:

insertStatement

但是在编译时我得到了:

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

请注意,这只是陈述准备,它甚至与exectution无关。这也是一个简化版本 - 我尝试了同样的附加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") ,它有相同的错误,所以它似乎与主键无关。

更新:事实证明这是一个警告转错误。我在下面留下了答案,以防其他人遇到这个问题。

2 个答案:

答案 0 :(得分:1)

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

N

虽然移除"-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下发出

标记为赢得修复的编译器上有一个相关的标记:&#34; unit insertion deprecation seems unavoidable in standard slick code

这意味着,此时您必须关闭-Xlint-Xlint以使此代码通过。

答案 1 :(得分:0)

user entity定义中,如下所述。

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

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