如果使用光滑'None'列值,则插入默认值



我的问题很简单。

我有一个列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值(并使用某个触发器默认它。

最新更新