如果列值为“无”,则插入默认值。使用光滑

时间:2015-02-12 07:10:40

标签: sql scala null slick

我的问题很简单。

我在seqNum: Double语句中有NOT NULL DEFAULT 1CREATE TABLE,如下所示:

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

当我从用户界面发送seqNum时,一切正常,但当None存在时,它会断言无法在NOT NULL列中插入NULL 哪个是对的。 This question解释了原因。

但如何使用slick解决此问题?无法理解我应该在哪里查看None?我创造了&amp;向SomeSection对象发送insertSomeSections方法的对象。

我使用sql-server,如果重要的话。

2 个答案:

答案 0 :(得分:7)

使用默认值不需要插入值而不是插入NULL。这意味着您需要自定义投影才能插入。

people.map(_.name).insert("Chris")将对所有其他字段使用默认值。 scala的原生元组转换和案例类转换的局限性可能使这有点麻烦。像Slick的HLists,Shapeless,Scala Records或Scala XR这样的东西可以提供帮助,但目前并非琐碎或非常实验性。

答案 1 :(得分:-1)

您可以通过使用Option对其进行后缀来强制执行传递给Slick的.getOrElse(theDefault),或者让数据库接受NULL(来自None值)并默认为使用一些触发器。