我的问题很简单。
我有一个列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))
光滑的表架构和对象如下所示:
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。这个问题解释了原因。
但是如何使用slick
来解决这个问题呢?不明白我应该在哪里检查None
?我正在创建并发送一个SomeSection
对象insert
SomeSections
对象的方法。
我正在使用sql-server,如果它很重要的话。
使用默认值根本不需要插入值,而是插入 NULL。这意味着您需要一个要插入的自定义投影。
people.map(_.name).insert("Chris")
将使用所有其他字段的默认值。Scala 的原生元组转换和案例类转换的局限性可能会使这变得有点麻烦。像Slick的HLists,Shapeless,Scala Records或Scala XR之类的东西可以提供帮助,但目前不是微不足道或非常实验性的。
通过用.getOrElse(theDefault)
后缀来强制执行传递给 Slick 的Option
,要么让数据库接受NULL
(从None
值(并使用某个触发器默认它。