我的问题很简单.
我有一个列seqNum:Double在CREATE TABLE语句中是NOT NULL DEFAULT 1,如下所示:
CREATE TABLE some_table ( ... seq_num DECIMAL(18,10) NOT NULL DEFAULT 1,... );
用户可以从UI输入seqNum的值.所以接受PLAY表格就像:
case class SomeCaseClass(...,seqNum: Option[Double],...) val secForm = Form(mapping( ... "seqNum" -> optional(of[Double]),... )(SomeCaseClass.apply)(SomeCaseClass.unapply))
光滑的Table Schema&对象看起来像这样:
case class SomeSection ( ... seqNum: Option[Double],... ) class SomeSections(tag: Tag) extends Table[SomeSection](tag,"some_table") { def * = ( ... seqNum.?,... ) <> (SomeSection.tupled,SomeSection.unapply _) ... def seqNum = column[Double]("seq_num",O.NotNull,O.Default(1)) ... } object SomeSections { val someSections = TableQuery[SomeSections] val autoInc = someSections returning someSections.map(_.sectionId) def insert(s: someSection)(implicit session: Session) = { autoInc.insert(s) } }
当我从UI发送seqNum时,一切正常,但是当有None时,它会断言无法在NOT NULL列中插入NULL,这是正确的. This question解释了原因.
但如何使用光滑解决这个问题?无法理解我应该在哪里检查无?我正在创造&发送SomeSection对象以插入SomeSections对象的方法.
我正在使用sql-server,如果重要的话.
解决方法
使用默认值不需要插入值而不是插入NULL.这意味着您需要插入自定义投影.
people.map(_.name).insert(“Chris”)将使用所有其他字段的默认值. scala的本机元组转换和案例类转换的局限性可能会使这有点麻烦.像Slick的HLists,Shapeless,Scala Records或Scala XR这样的东西可以提供帮助,但目前并非琐碎或非常实验性的.