假设:
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")
,它有相同的错误,所以它似乎与主键无关。
更新:事实证明这是一个警告转错误。我在下面留下了答案,以防其他人遇到这个问题。
答案 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
无论
标记为赢得修复的编译器上有一个相关的标记:&#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的表上。