【问题标题】:Creating a single column table with Slick使用 Slick 创建单列表
【发布时间】:2017-04-25 03:55:01
【问题描述】:

我已经很习惯像这样编写标准的光滑样板代码了。

假设我正在创建一个名为 Foo 的表,其中包含列 id 和 name。我们可以写

case class Foo(id: Long, name: String)
final class FooTable(tag: Tag) extends Table[Foo](tag, "foo") {
   def id = column[Long]("id")
   def name = column[String]("name")
   def * = (id, name) <> (Foo.tupled, Foo.unapply)
}

但是,如果我想要一个 Foo 只有一个名称的单列表怎么办。下面的代码无法编译,因为 Now Foo 没有元组方法了。

case class Foo(name: String)
final class FooTable(tag: Tag) extends Table[Foo](tag, "foo") {
   def name = column[String]("name")
   def * = (name) <> (Foo.tupled, Foo.unapply)
}

我在 SO 上找到了这个帖子

Scala projections in Slick for only one column

并将我的代码更改为

case class Foo(name: String)
final class FooTable(tag: Tag) extends Table[Foo](tag, "foo") {
   def name = column[String]("email_address")
   def * = (name)
}

但仍然无法编译

【问题讨论】:

    标签: scala slick slick-3.0


    【解决方案1】:

    在单个参数的情况下使用Foo.apply _。您的代码如下

    case class Foo(name: String)
    
    final class FooTable(tag: Tag) extends Table[Foo](tag, "foo") {
      def name = column[String]("name")
      def * = (name) <> ((Foo.apply _), Foo.unapply)
    }
    

    解释:

    scala> case class Foo(name: String)
    defined class Foo
    
    scala> Foo.apply _
    res0: String => Foo = <function1>
    

    如果是单参数案例类Foo.apply _,则返回一个function1,这是所需要的。

    但如果有多个参数,这是不可能的,所以应该使用.tupled

    【讨论】:

      【解决方案2】:

      也找到了另一个答案

      case class Foo(name: String)
      final class FooTable(tag: Tag) extends Table[Foo](tag, "foo") {
         def name = column[String]("name")
         def * = name <> (Foo, Foo.unapply)
      }
      

      【讨论】:

        【解决方案3】:

        我相信以前的答案已经解决了这个特殊问题。不过,我认为这里有一点值得补充。

        Slick 中没有任何内容要求您将case classes 用作unpacked typeunpacked type 是您的模型,在本例中为Foo)。

        在您的投影中:

        def * = (id, name) <> (Foo.tupled, Foo.unapply)
        

        你可以传递你想要的任何两个函数,假设:

        • 第一个将从元组(投影中的 2 列以上)或值(1 列投影)中创建您的 unpacked type

        • second 将创建元组(同样在投影中有 2+ 列的情况下)或
          值(1 列投影)。

        case classes 可以直接生成这些方法(tupledapplyunapply),这很方便。

        我希望这可以澄清,即使您缺少这样的方法,也总是可以(在最坏的情况下)例如创建满足给定要求的函数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-15
          相关资源
          最近更新 更多