【问题标题】:Why doesn't MySQLDriver have a Nullable Column Option?为什么 MySQLDriver 没有可空列选项?
【发布时间】:2026-01-30 18:10:01
【问题描述】:

我的光滑表定义中有这行代码

def firstName = column[Option[String]]("first_name", O.Nullable)

但我在编译时收到此错误

[error] /Users/roy/adivinate/survey2/app/model/Respondent.scala:36:
 value Nullable is not a member of slick.driver.MySQLDriver.ColumnOptions

我很困惑,因为这正是我在其他代码中看到的语法,尽管我不确定他们是否使用 MySQLDriver。我应该为空列做什么?

【问题讨论】:

    标签: scala playframework slick


    【解决方案1】:

    O.Nullable 已弃用。声明字段Option[T] 就可以了。

    在模型类中将您的字段声明为 Option[T] 而不是 T 以使相应的列为 Nullable

    让我们通过一个例子来理解这一点

    case class Foo(name: String, rating: Option[Int])
    
    class Foos(tag: Tag) extends Table[Foo](tag, "foos") {
      def name = column[String]("name") //name is not null
      def rating = column[Option[Int]]("rating") //rating is nullable
      def * = (name, rating) <> (Foo.tupled, Foo.unapply)
    }
    

    如果你想让某些东西可以为空,只需将其声明为Option 字段,这样它就会理解并生成带有该特定字段为可空的 sql。

    上述设计与 Scala Option 设计是无缝且合理的。意思是Scala中的option直接转换为sql中的Nullable。

    在旧版本的 Slick 中

    您必须通过在列声明中显式传递 O.NotNull 来告诉特定列不为空,但在新版本的 slick 中不需要它

    【讨论】:

    • 谢谢。我想通了。我也遇到了问题,因为忘记更改案例类中的数据类型。得到它的工作:)
    最近更新 更多