在Slick中声明表格

时间:2013-04-07 02:15:27

标签: database scala static slick

我在Slick尝试做多对多关系时遇到了错误。这个test显示了如何在Slick中执行多对多关系。我跟着它然后去了这个错误:

 Select(TableNode, "id") found. This is typically caused by an attempt to use a "raw" table object directly in a query without introducing it through a generator

然后我发现这是因为在静态位置(一个对象)声明你的表然后尝试导入它(如果对象在同一个块中它可以正常工作)。 http://slick.typesafe.com/doc/1.0.0/lifted-embedding.html#tables

好的,val T = new Table内的object就是答案。但现在我收到了这个错误:

recursive method bs needs result type 

如果是object而不是val,则不需要结果类型。我听说过使用class,但我找不到任何关于如何执行此操作的示例。

如何声明多对多模型并从其他地方导入它们?

编辑: 以下是我的意思:https://gist.github.com/pjrt/5332311

如果您运行第一个测试,它将通过,没有问题。

如果您运行第二个测试,则会引发以下错误:

scala.slick.SlickException: Select(TableNode, "id") found. This is typically caused by an attempt to use a "raw" table object directly in a query without introducing it through a generator.

如果你运行第三次测试(使用对象内部的val而不是直接使用对象),则会出现此错误:

recursive method bs needs result type
[error]   val A = new Table[(Int, String)]("a") {

recursive value AToB needs type
[error]     def as = AToB.filter(_.bId === id).flatMap(_.aFK)

我知道错误发生的原因,但我想知道人们是如何绕过它们的。一种方法是将对象放在一个类中,并在每次要使用Slick时实例化一个类(但这看起来很奇怪)。另一种方法是永远不要在包装之外使用与Slick相关的东西(或者至少是多对多的东西),但这看起来也很糟糕。

我的问题仍然是,你们是如何解决这个问题的?有没有正确的方法?

1 个答案:

答案 0 :(得分:0)

您显示的错误消息让我认为您已定义了表格,但却尝试直接访问它们而不是使用for comprehension。

test file you were referring在定义多对多表之后,在底部有一个示例

val q1 = for {
  a <- A if a.id >= 2
  b <- a.bs
} yield (a.s, b.s)
q1.foreach(x => println("  "+x))
assertEquals(Set(("b","y"), ("b","z")), q1.list.toSet)

你看到的是对象表A被用作理解生成器(即a <- A

您的代码是否以其他方式访问表格?