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

Play Framework集成Slick后Evolutions未执行问题求助

问题排查与解决方案

一、Evolutions未执行的原因及修复

Evolutions默认依赖JDBC数据源,迁移到Slick后需确保配置关联正确:

  • 确认Evolutions启用目标数据库
    在application.conf中明确指定启用对应数据库的Evolutions(需和Slick配置的数据库名称一致,通常为default):
    play.evolutions.db.default.enabled = true
    play.evolutions.db.default.autoApply = true # 可选,自动执行升级脚本
    
  • 检查Evolutions脚本规范
    脚本需放在conf/evolutions/default/目录下,命名为1.sql、2.sql递增格式,开头必须包含标准标记:
    # --- !Ups
    -- 升级脚本示例:创建表
    CREATE TABLE IF NOT EXISTS your_table (id SERIAL PRIMARY KEY, name VARCHAR(255));
    
    # --- !Downs
    -- 回滚脚本示例:删除表
    DROP TABLE IF EXISTS your_table;
    
  • 验证日志输出
    启动应用时查看日志,若出现Applying evolution 1相关内容,说明Evolutions已执行;若无,检查配置是否被其他规则覆盖。

二、Guice注入驱动实例错误的修复

该错误通常由Slick与JDBC配置不兼容、依赖缺失导致:

  • 补全依赖项
    在build.sbt中确保同时包含PostgreSQL JDBC驱动、Slick核心及连接池依赖(版本需适配Play框架和PostgreSQL 14.5):
    libraryDependencies ++= Seq(
      guice,
      "org.postgresql" % "postgresql" % "42.6.0", // 适配PostgreSQL 14的稳定版本
      "com.typesafe.slick" %% "slick" % "3.4.1",
      "com.typesafe.slick" %% "slick-hikaricp" % "3.4.1",
      evolutions // 保留Evolutions依赖
    )
    
  • 统一数据库配置
    让Slick复用JDBC的数据源配置,确保application.conf兼容Evolutions和Slick:
    # JDBC基础配置(供Evolutions使用)
    db.default.driver = org.postgresql.Driver
    db.default.url = "jdbc:postgresql://localhost:5432/app"
    db.default.username = "your-db-username"
    db.default.password = "your-db-password"
    
    # Slick配置(复用JDBC连接池)
    slick.dbs.default.profile = "slick.jdbc.PostgresProfile$"
    slick.dbs.default.db.dataSourceClass = "slick.jdbc.DatabaseUrlDataSource"
    slick.dbs.default.db.properties.driver = ${db.default.driver}
    slick.dbs.default.db.properties.url = ${db.default.url}
    slick.dbs.default.db.properties.user = ${db.default.username}
    slick.dbs.default.db.properties.password = ${db.default.password}
    
  • 修正Slick客户端注入逻辑
    使用Play提供的DatabaseConfigProvider进行Guice注入,避免手动配置错误:
    import slick.jdbc.PostgresProfile.api._
    import javax.inject.Inject
    import play.api.db.slick.DatabaseConfigProvider
    import slick.jdbc.JdbcProfile
    import scala.concurrent.Future
    
    class SlickDBClient @Inject()(dbConfigProvider: DatabaseConfigProvider) {
      private val dbConfig = dbConfigProvider.get[JdbcProfile]
      import dbConfig.profile.api._
    
      // 示例表定义
      class YourTable(tag: Tag) extends Table[(Int, String)](tag, "your_table") {
        def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
        def name = column[String]("name")
        def * = (id, name)
      }
      val yourTables = TableQuery[YourTable]
    
      // 修正后的testAdd方法
      def testAdd(name: String): Future[Int] = {
        db.run(yourTables.map(_.name) += name)
      }
    }
    

三、验证步骤

  1. 清理旧数据库(可选),确保初始状态干净;
  2. 重启应用,查看日志确认Evolutions脚本执行;
  3. 调用testAdd方法后,直接查询数据库验证表数据是否插入成功。

内容的提问来源于stack exchange,提问作者Arthur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:41:17