1

洗練された n00b の並べ替え...挿入ステートメントを作成しようとしていますが、何も挿入していないことがわかりました。

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)
}

REACHED 1 は、POST 要求が発行されたときに (目的の値で) 印刷されますが、REACHED 2 は印刷されません。(また、明らかに、データベースにクエリを実行すると、挿入された値は返されません。)これについて洞察を持っている人はいますか?

編集、ここに私のユーザーテーブルの定義があります:

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
 }
4

1 に答える 1

4

Users オブジェクト定義では、これを変更する必要があります。

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

これに:

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

idは DBMS ( ) によって割り当てられるためO.AutoIncです。ここの例を参照してください: http://slick.typesafe.com/doc/1.0.1/lifted-embedding.html#mapped-tables

次に、これを変更する必要があります。

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

これに:

def * = userId.? ~ userName ~ email.? ~ userPassword ~ creationDate.? ~
        lastLoginDate ~ removed.?

として定義されているためOptionです。ここを参照してください: http://slick.typesafe.com/doc/1.0.1/lifted-embedding.html#mapped-tables

newUser挿入行には、次のようにする必要があります。

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

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

なしuserId。DBMS によって割り当てられるためです。ここの例を参照してください: http://slick.typesafe.com/doc/1.0.1/lifted-embedding.html#inserting

データベースで Null を受け入れないため、これを変更することをお勧めします。

def newUser(userName: String, email: Option[String], password: String = null, removed: Option[Int] = null)

これに:

def newUser(userName: String, email: Option[String], password: String, removed: Option[Int] = null)

パスワードが null でないことを確認します。

pedrofurla の提案に従って、Usersオブジェクトに以下を追加できます。

def forInsert = Users.userName ~ Users.email.? ~ Users.userPassword ~ 
                Users.creationDate.? ~ Users.lastLoginDate ~ Users.removed.?

行を読みやすくします。

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

http://slick.typesafe.com/doc/1.0.1/lifted-embedding.html#insertingを参照してください

于 2013-07-24T16:52:10.967 に答える