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) } }
三、验证步骤
- 清理旧数据库(可选),确保初始状态干净;
- 重启应用,查看日志确认Evolutions脚本执行;
- 调用
testAdd方法后,直接查询数据库验证表数据是否插入成功。
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

