ZIO Quill报错:无法找到models.Pet的隐式SchemaMeta
ZIO Quill查询宠物数据报错:找不到models.Pet的隐式SchemaMeta
我正在用ZIO和Quill开发宠物店应用,本地搭建了H2数据库存储宠物信息,但执行查询时出现报错:Can't find an implicit SchemaMeta for type models.Pet。已定义Pet样例类,并在其伴生对象中提供了隐式定义,检查过导入项、依赖以及数据库表名和字段名的匹配性,均未发现问题,求分析原因和解决办法。
Pet类代码
package models import config.QuillContext.{querySchema, quote} import io.getquill.{EntityQuery, Quoted} import zio.json.{DeriveJsonCodec, JsonCodec} import zio.schema.{DeriveSchema, Schema} import java.util.UUID final case class Pet( petId:UUID, name: String, species:String, ownerId:UUID ) object Pet { implicit val petSchemaMeta: Quoted[EntityQuery[Pet]] = quote { querySchema[Pet]( "PETS", _.petId -> "PET_ID", _.name -> "NAME", _.species -> "SPECIES", _.ownerId -> "OWNER_ID" ) } implicit val codec: JsonCodec[Pet] = DeriveJsonCodec.gen[Pet] implicit val petSchema: Schema[Pet] = DeriveSchema.gen[Pet] }
Quill上下文配置
package config import com.zaxxer.hikari.{HikariConfig, HikariDataSource} import io.getquill.{H2ZioJdbcContext, SnakeCase, UpperCase} import models.Pet import zio.ZLayer import javax.sql.DataSource object QuillContext extends H2ZioJdbcContext(UpperCase){ val dburl = "jdbc:h2:./test" val userName = "sa" val password = "password" val h2dbConfig = new HikariConfig() h2dbConfig.setJdbcUrl(dburl) h2dbConfig.setUsername(userName) h2dbConfig.setPassword(password) val dataSource = new HikariDataSource(h2dbConfig) val dataSourceLayer:ZLayer[Any,Throwable,DataSource] = ZLayer.succeed(dataSource) //added Schema Meta implicit val petSchemaMeta: SchemaMeta[Pet] = schemaMeta[Pet]("pets") }
build.sbt配置
ThisBuild / version := "0.1.0-SNAPSHOT" ThisBuild / scalaVersion := "2.13.13" lazy val root = (project in file(".")) .settings( name := "zio-pets-learn" ) libraryDependencies ++= Seq( "dev.zio" %% "zio" % "2.1-RC1", "io.getquill" %% "quill-zio" % "4.8.0", "io.getquill" %% "quill-jdbc-zio" % "4.8.1", "com.h2database" % "h2" % "2.2.224", "dev.zio" %% "zio-schema" % "0.4.15", "dev.zio" %% "zio-schema-derivation" % "0.4.15", "org.scala-lang" % "scala-reflect" % scalaVersion.value % "provided" )
问题原因
- 隐式定义冲突且类型不匹配:
QuillContext和Pet伴生对象中都定义了petSchemaMeta,但前者类型是SchemaMeta[Pet],后者是Quoted[EntityQuery[Pet]],Scala隐式解析时无法匹配到正确的实例。 - Quill依赖版本不一致:
quill-zio用4.8.0,quill-jdbc-zio用4.8.1,版本差异可能导致隐式解析逻辑异常。
解决办法
1. 清理冲突的隐式定义
保留Pet伴生对象中带字段映射的querySchema定义,删除QuillContext里的SchemaMeta[Pet]定义:
package config import com.zaxxer.hikari.{HikariConfig, HikariDataSource} import io.getquill.{H2ZioJdbcContext, UpperCase} import zio.ZLayer import javax.sql.DataSource object QuillContext extends H2ZioJdbcContext(UpperCase){ val dburl = "jdbc:h2:./test" val userName = "sa" val password = "password" val h2dbConfig = new HikariConfig() h2dbConfig.setJdbcUrl(dburl) h2dbConfig.setUsername(userName) h2dbConfig.setPassword(password) val dataSource = new HikariDataSource(h2dbConfig) val dataSourceLayer:ZLayer[Any,Throwable,DataSource] = ZLayer.succeed(dataSource) // 移除冲突的petSchemaMeta定义 }
2. 统一Quill依赖版本
将quill-zio版本改为与quill-jdbc-zio一致的4.8.1:
libraryDependencies ++= Seq( "dev.zio" %% "zio" % "2.1-RC1", "io.getquill" %% "quill-zio" % "4.8.1", "io.getquill" %% "quill-jdbc-zio" % "4.8.1", "com.h2database" % "h2" % "2.2.224", "dev.zio" %% "zio-schema" % "0.4.15", "dev.zio" %% "zio-schema-derivation" % "0.4.15", "org.scala-lang" % "scala-reflect" % scalaVersion.value % "provided" )
3. 确保查询时的隐式导入
在执行查询的代码中,导入必要的隐式:
import config.QuillContext._ import models.Pet._ // 示例查询 val getAllPets = run(query[Pet])
内容的提问来源于stack exchange,提问作者Penchala Yegu
相关产品推荐
相关产品推荐

