光滑的Scala不插入任何值

光滑的Scala不插入任何值,scala,slick,scalatra,Scala,Slick,Scalatra,有点圆滑的n00b…我试图构建一个insert语句,但发现我没有插入任何内容 def newUser(userName: String, email: Option[String], password: String = null, removed: Option[Int] = null) = SlickInit.dbMaster withSession { val creation = Option(new java.sql.Timestamp(new java.util.Date().

有点圆滑的n00b…我试图构建一个insert语句,但发现我没有插入任何内容

def newUser(userName: String, email: Option[String], password: String = null, removed: Option[Int] = null) = SlickInit.dbMaster withSession {

  val creation = Option(new java.sql.Timestamp(new java.util.Date().getTime()))
  val last = new java.sql.Timestamp(new java.util.Date().getTime())

  printf("REACHED 1. creation: " + creation + "\n last: " + last)
  println("\nusername: " + userName + "\n email: " + email)
  println("maxId: " + maxId)

  val invoker = Users.insertInvoker

  (Users.userId ~ Users.userName ~ Users.email ~ Users.userPassword ~ Users.creationDate ~ Users.lastLoginDate ~ Users.removed).insert(maxId, userName, email, password, creation, last, removed)

  val statement = Users.insertStatement
  println("REACHED 2. \n\nStatement: " + statement)
}
发出POST请求时,已达到1打印所需值,但未达到2。我肯定我的insert语句有问题,但我不确定是什么问题。另外,很明显,当我查询数据库时,插入的值不会返回。有人对此有什么见解吗

编辑,这是我的用户表定义:

object Users extends Table[(Int, String, Option[String], String, Option[Timestamp], Timestamp, Option[Int])]("APUsers") {

   def userId          = column[Int]("UserId", O.PrimaryKey, O.AutoInc)
   def userName        = column[String]("UserName")
   def email           = column[Option[String]]("Email", O.Nullable)
   def userPassword    = column[String]("UserPassword")
   def creationDate    = column[Option[Timestamp]]("CreationDate", O.Nullable)
   def lastLoginDate   = column[Timestamp]("LastLoginDate")
   def removed         = column[Option[Int]]("removed", O.Nullable)

   def * = userId ~ userName ~ email ~ userPassword ~ creationDate ~ lastLoginDate ~ removed
 }

在用户对象定义中,您需要更改以下内容:

object Users extends Table[(Int, String, Option[String], String, Option[Timestamp], Timestamp, Option[Int])]("APUsers") {
def * = userId ~ userName ~ email ~ userPassword ~ creationDate ~
        lastLoginDate ~ removed
def newUser(userName: String, email: Option[String], password: String = null, removed: Option[Int] = null)
为此:

object Users extends Table[(Option[Int], String, Option[String], String, Option[Timestamp], Timestamp, Option[Int])]("APUsers") {
def * = userId.? ~ userName ~ email.? ~ userPassword ~ creationDate.? ~
        lastLoginDate ~ removed.?
def newUser(userName: String, email: Option[String], password: String, removed: Option[Int] = null)
因为id是由DBMS O.AutoInc分配的。请参见此处的示例:

然后您需要更改此选项:

object Users extends Table[(Int, String, Option[String], String, Option[Timestamp], Timestamp, Option[Int])]("APUsers") {
def * = userId ~ userName ~ email ~ userPassword ~ creationDate ~
        lastLoginDate ~ removed
def newUser(userName: String, email: Option[String], password: String = null, removed: Option[Int] = null)
为此:

object Users extends Table[(Option[Int], String, Option[String], String, Option[Timestamp], Timestamp, Option[Int])]("APUsers") {
def * = userId.? ~ userName ~ email.? ~ userPassword ~ creationDate.? ~
        lastLoginDate ~ removed.?
def newUser(userName: String, email: Option[String], password: String, removed: Option[Int] = null)
因为它们被定义为选项。请看这里:

在newUser中,插入行应为:

(Users.userId ~ Users.userName ~ Users.email ~ Users.userPassword ~
 Users.creationDate ~ Users.lastLoginDate ~ Users.removed)

没有用户ID,因为它将由DBMS分配。请参见此处的示例:

由于您不接受数据库中的Null,因此我建议更改此选项:

object Users extends Table[(Int, String, Option[String], String, Option[Timestamp], Timestamp, Option[Int])]("APUsers") {
def * = userId ~ userName ~ email ~ userPassword ~ creationDate ~
        lastLoginDate ~ removed
def newUser(userName: String, email: Option[String], password: String = null, removed: Option[Int] = null)
为此:

object Users extends Table[(Option[Int], String, Option[String], String, Option[Timestamp], Timestamp, Option[Int])]("APUsers") {
def * = userId.? ~ userName ~ email.? ~ userPassword ~ creationDate.? ~
        lastLoginDate ~ removed.?
def newUser(userName: String, email: Option[String], password: String, removed: Option[Int] = null)
并检查密码是否为空

根据pedrofurla的建议,您可以向Users对象添加以下内容:

让这句话更具可读性:

Users.forInsert.insert(userName, email, password, creation, last, removed)

请参见用户对象定义中的

,您需要更改以下内容:

object Users extends Table[(Int, String, Option[String], String, Option[Timestamp], Timestamp, Option[Int])]("APUsers") {
def * = userId ~ userName ~ email ~ userPassword ~ creationDate ~
        lastLoginDate ~ removed
def newUser(userName: String, email: Option[String], password: String = null, removed: Option[Int] = null)
为此:

object Users extends Table[(Option[Int], String, Option[String], String, Option[Timestamp], Timestamp, Option[Int])]("APUsers") {
def * = userId.? ~ userName ~ email.? ~ userPassword ~ creationDate.? ~
        lastLoginDate ~ removed.?
def newUser(userName: String, email: Option[String], password: String, removed: Option[Int] = null)
因为id是由DBMS O.AutoInc分配的。请参见此处的示例:

然后您需要更改此选项:

object Users extends Table[(Int, String, Option[String], String, Option[Timestamp], Timestamp, Option[Int])]("APUsers") {
def * = userId ~ userName ~ email ~ userPassword ~ creationDate ~
        lastLoginDate ~ removed
def newUser(userName: String, email: Option[String], password: String = null, removed: Option[Int] = null)
为此:

object Users extends Table[(Option[Int], String, Option[String], String, Option[Timestamp], Timestamp, Option[Int])]("APUsers") {
def * = userId.? ~ userName ~ email.? ~ userPassword ~ creationDate.? ~
        lastLoginDate ~ removed.?
def newUser(userName: String, email: Option[String], password: String, removed: Option[Int] = null)
因为它们被定义为选项。请看这里:

在newUser中,插入行应为:

(Users.userId ~ Users.userName ~ Users.email ~ Users.userPassword ~
 Users.creationDate ~ Users.lastLoginDate ~ Users.removed)

没有用户ID,因为它将由DBMS分配。请参见此处的示例:

由于您不接受数据库中的Null,因此我建议更改此选项:

object Users extends Table[(Int, String, Option[String], String, Option[Timestamp], Timestamp, Option[Int])]("APUsers") {
def * = userId ~ userName ~ email ~ userPassword ~ creationDate ~
        lastLoginDate ~ removed
def newUser(userName: String, email: Option[String], password: String = null, removed: Option[Int] = null)
为此:

object Users extends Table[(Option[Int], String, Option[String], String, Option[Timestamp], Timestamp, Option[Int])]("APUsers") {
def * = userId.? ~ userName ~ email.? ~ userPassword ~ creationDate.? ~
        lastLoginDate ~ removed.?
def newUser(userName: String, email: Option[String], password: String, removed: Option[Int] = null)
并检查密码是否为空

根据pedrofurla的建议,您可以向Users对象添加以下内容:

让这句话更具可读性:

Users.forInsert.insert(userName, email, password, creation, last, removed)

请参见

是否也可以发布用户对象定义?是否看到引发的异常?您使用的是内存数据库吗?能否同时发布用户对象定义?是否看到引发的异常?你在使用内存数据库吗?谢谢你的建议,大卫。不幸的是,Eclipse抛出了错误:-插入方法的参数太多:value:Int,String,Option[Option[String]],String,Option[Option[java.sql.Timestamp]],java.sql.Timestamp,Option[Option[Int]]隐式会话:scala.slick.session.session建议使用投影*。用户。*.insert…@pedrofurla我在答案中添加了您的建议。哦,是的,我忘记了PK。我通常会做另一个包含插入字段的投影。是的,我也这样做:-代表以下内容删除当一些数据库系统允许向AutoInc列插入正确的值或不插入任何值以获得创建的值时,大多数数据库禁止这种行为,所以您必须确保忽略这些列。Slick还没有自动完成这项工作的功能,但它计划在未来发布。现在,您必须使用不包含AutoInc列的投影:谢谢David的建议。不幸的是,Eclipse抛出了错误:-插入方法的参数太多:value:Int,String,Option[Option[String]],String,Option[Option[java.sql.Timestamp]],java.sql.Timestamp,Option[Option[Int]]隐式会话:scala.slick.session.session建议使用投影*。用户。*.insert…@pedrofurla我在答案中添加了您的建议。哦,是的,我忘记了PK。我通常会做另一个包含插入字段的投影。是的,我也这样做:-代表以下内容删除当一些数据库系统允许向AutoInc列插入正确的值或不插入任何值以获得创建的值时,大多数数据库禁止这种行为,所以您必须确保忽略这些列。Slick还没有自动完成这项工作的功能,但它计划在未来发布。目前,您必须使用不包括AutoInc列的投影: