You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:35:05