【发布时间】: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_at 和 created_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