Assign dynamically injected database name in Play Slick
我有以下Play Slick DAO课程。请注意,数据库配置是常量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class UsersDAO @Inject()(@NamedDatabase("control0001") protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] { import driver.api._ def readUser (userid: String) = { val users = TableQuery[UserDB] val action = users.filter(_.userid === userid).result val future = db.run(action.asTry) future.map{ case Success(s) => if (s.length>0) Some(s(0)) else None case Failure(e) => throw new Exception ("Failure in readUser:" + e.getMessage) } } } |
而不是在
以下Play类调用DAO函数,但首先需要确定要注入的数据库名称:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class TestSlick @Inject()(dao: UsersDAO) extends Controller { def test(someCode: Int, userId: String) = Action { request => val databaseName = if (someCode == 1)"control0001" else"control0002" // Run the method in UsersDAO accessing the database set by databaseName val future = dao.readUser(userId) future.map { result => result match { case Some(user) => Ok(user.firstName) case _ => Ok("user not found") } } } } |
如何在Play Slick中实现?
您可以尝试初始化覆盖默认配置的slick db对象:
slick docs中的更多信息http://slick.lightbend.com/doc/3.0.0/database.html
在这种情况下,不要尝试使用Play的运行时依赖项注入实用程序,而应直接在DAO中使用
1 2 3 4 5 6 7 8 9 10 11 |
然后在您的控制器中:
1 2 3 4 5 6 |