为什么这个简单的羽毛笔引述无法编译?
Why does this simple quill quote fails to compile?
我正在试用 scala 和 quill (getquill.io)。下面这个最小的例子无法编译。这是为什么?它只定义了一个class。我怀疑我需要以某种方式标记 class 以便 quill 能够解析它,但我不知道如何。我被 quill over slick 所吸引,因为我不必标记大小写 classes,它们应该可以正常工作,对吗?
package dbquerytest
import io.getquill._
/*in a real life you would rather pass execution context as
a method or constructor argument, but we're just playing*/
import scala.concurrent.ExecutionContext.Implicits.global
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
case class Intake( id:Int, path:String, stage:Int) // , timestamp: Instant
// running/using junit test:https://alvinalexander.com/scala/how-to-use-junit-testing-with-scala
class MysqlLocalDbTest {
@Test
def testIntake={
val ctx = new MysqlAsyncContext(SnakeCase, "testdb")
import ctx._
val intakes = quote { query[Intake].map(_.id )}
ctx.run(intakes).map(_.headOption)
assertEquals(0,0)
}
}
编译在 io.getquill.quotation.Parsing 处失败。
首先,我可以看到您在代码片段中使用的是 JUnit 5,但似乎存在一些问题。将 JUnit 5 与 Scala 和 sbt 结合使用: https://github.com/sbt/junit-interface/issues/75 。替代方案包括使用 JUnit 4 或 ScalaTest 或 specs2 等特定于 Scala 的测试库之一(ScalaCheck 也值得一提,尽管我通常只将它与 ScalaTest 或 specs2 结合使用)。
其次,不知道你用的是哪个构建工具,如果相关的依赖都在里面,可能是编译错误的原因。如果您使用的是 sbt ( https://www.scala-sbt.org/ ),我认为它是使用 Scala 进行开发时最常用的构建工具,一个可能的示例说明它如何查找您的示例(使用 JUnit 4):
build.sbt:
import Dependencies._
ThisBuild / scalaVersion := "2.12.8"
ThisBuild / version := "0.1.0-SNAPSHOT"
ThisBuild / organization := "com.example"
ThisBuild / organizationName := "example"
lazy val root = (project in file("."))
.settings(
name := "quilltesting",
libraryDependencies ++= Seq(
"mysql" % "mysql-connector-java" % "8.0.15",
"io.getquill" %% "quill-jdbc" % "3.1.0",
"io.getquill" %% "quill-async-mysql" % "3.1.0",
// JUnit 4.
"com.novocode" % "junit-interface" % "0.11" % Test
)
)
要从头开始生成一个快速项目以使用 sbt 进行测试,请在某处创建一个新文件夹,从命令行进入该文件夹并 运行 sbt new sbt/scala-seed.g8
。然后进入文件夹,运行sbt
。之后,运行 test
.
我已将您的示例更改为使用 JUnit 4,它似乎可以编译并且 运行:
package dbquerytest
import io.getquill._
/*in a real life you would rather pass execution context as
a method or constructor argument, but we're just playing*/
import scala.concurrent.ExecutionContext.Implicits.global
import org.junit.Test
import junit.framework.TestCase
import org.junit.Assert._
case class Intake( id:Int, path:String, stage:Int)
// running/using junit test:https://alvinalexander.com/scala/how-to-use-junit-testing-with-scala
class MysqlLocalDbTest {
@Test
def testIntake = {
val ctx = new MysqlAsyncContext(SnakeCase, "testdb")
import ctx._
val intakes = quote { query[Intake].map(_.id )}
ctx.run(intakes).map(_.headOption)
assertEquals(0,0)
}
}
如果您想尝试其他示例,还有 https://scastie.scala-lang.org/QwOewNEiR3mFlKIM7v900A , as linked to in https://getquill.io/#quotation-introduction .
我正在试用 scala 和 quill (getquill.io)。下面这个最小的例子无法编译。这是为什么?它只定义了一个class。我怀疑我需要以某种方式标记 class 以便 quill 能够解析它,但我不知道如何。我被 quill over slick 所吸引,因为我不必标记大小写 classes,它们应该可以正常工作,对吗?
package dbquerytest
import io.getquill._
/*in a real life you would rather pass execution context as
a method or constructor argument, but we're just playing*/
import scala.concurrent.ExecutionContext.Implicits.global
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
case class Intake( id:Int, path:String, stage:Int) // , timestamp: Instant
// running/using junit test:https://alvinalexander.com/scala/how-to-use-junit-testing-with-scala
class MysqlLocalDbTest {
@Test
def testIntake={
val ctx = new MysqlAsyncContext(SnakeCase, "testdb")
import ctx._
val intakes = quote { query[Intake].map(_.id )}
ctx.run(intakes).map(_.headOption)
assertEquals(0,0)
}
}
编译在 io.getquill.quotation.Parsing 处失败。
首先,我可以看到您在代码片段中使用的是 JUnit 5,但似乎存在一些问题。将 JUnit 5 与 Scala 和 sbt 结合使用: https://github.com/sbt/junit-interface/issues/75 。替代方案包括使用 JUnit 4 或 ScalaTest 或 specs2 等特定于 Scala 的测试库之一(ScalaCheck 也值得一提,尽管我通常只将它与 ScalaTest 或 specs2 结合使用)。
其次,不知道你用的是哪个构建工具,如果相关的依赖都在里面,可能是编译错误的原因。如果您使用的是 sbt ( https://www.scala-sbt.org/ ),我认为它是使用 Scala 进行开发时最常用的构建工具,一个可能的示例说明它如何查找您的示例(使用 JUnit 4):
build.sbt:
import Dependencies._
ThisBuild / scalaVersion := "2.12.8"
ThisBuild / version := "0.1.0-SNAPSHOT"
ThisBuild / organization := "com.example"
ThisBuild / organizationName := "example"
lazy val root = (project in file("."))
.settings(
name := "quilltesting",
libraryDependencies ++= Seq(
"mysql" % "mysql-connector-java" % "8.0.15",
"io.getquill" %% "quill-jdbc" % "3.1.0",
"io.getquill" %% "quill-async-mysql" % "3.1.0",
// JUnit 4.
"com.novocode" % "junit-interface" % "0.11" % Test
)
)
要从头开始生成一个快速项目以使用 sbt 进行测试,请在某处创建一个新文件夹,从命令行进入该文件夹并 运行 sbt new sbt/scala-seed.g8
。然后进入文件夹,运行sbt
。之后,运行 test
.
我已将您的示例更改为使用 JUnit 4,它似乎可以编译并且 运行:
package dbquerytest
import io.getquill._
/*in a real life you would rather pass execution context as
a method or constructor argument, but we're just playing*/
import scala.concurrent.ExecutionContext.Implicits.global
import org.junit.Test
import junit.framework.TestCase
import org.junit.Assert._
case class Intake( id:Int, path:String, stage:Int)
// running/using junit test:https://alvinalexander.com/scala/how-to-use-junit-testing-with-scala
class MysqlLocalDbTest {
@Test
def testIntake = {
val ctx = new MysqlAsyncContext(SnakeCase, "testdb")
import ctx._
val intakes = quote { query[Intake].map(_.id )}
ctx.run(intakes).map(_.headOption)
assertEquals(0,0)
}
}
如果您想尝试其他示例,还有 https://scastie.scala-lang.org/QwOewNEiR3mFlKIM7v900A , as linked to in https://getquill.io/#quotation-introduction .