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

Sun*_*mar 8 sql null scala slick

我的问题很简单.

我有一列seqNum: DoubleNOT NULL DEFAULT 1CREATE TABLE声明如下:

CREATE TABLE some_table
(
    ...
    seq_num DECIMAL(18,10) NOT NULL DEFAULT 1,
    ...
);
Run Code Online (Sandbox Code Playgroud)

用户可以seqNum在UI中输入或不输入值.所以接受PLAY形式如下:

case class SomeCaseClass(..., seqNum: Option[Double], ...)
val secForm = Form(mapping(
    ...
    "seqNum" -> optional(of[Double]),
    ...
  )(SomeCaseClass.apply)(SomeCaseClass.unapply))
Run Code Online (Sandbox Code Playgroud)

光滑的Table Schema&Objects看起来像这样:

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

当我seqNum从UI 发送时,一切正常,但是当None它存在时,它会断言无法在NOT NULL列中插入NULL,这是正确的.这个问题解释了原因.

但如何解决这个问题slick呢?无法理解我应该在哪里检查一下None?我创建和发送的对象SomeSection,以insert方法SomeSections的对象.

我正在使用sql-server,如果重要的话.

cvo*_*ogt 7

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

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


cch*_*tep -1

您可以Option通过添加后缀来强制传递给 Slick .getOrElse(theDefault),或者让数据库接受NULL(来自某个None值)并使用某种触发器将其默认。

  • 如果我使用 .getOrElse(theDefault) ,那么创建表时设置的默认值将没有用,因为我将传递一些东西。 (3认同)