Play evolution not applied in custom Slick environment configuration

298 Views Asked by At

DESCRIPTION:

Hi. I am using Play framework and Slick and PostgreSQL for my application. So I design CI_Pipelines and configure them in my application.conf.When we set slick configuration like this:

play.evolutions.db.default {
  enabled = true
  autoApply=true
} 
slick.dbs.default {
driver="slick.driver.PostgresDriver$"
db {
    driver=org.postgresql.Driver
    dbName=dbName
    url="jdbc:postgresql://127.0.0.1/dbName"
    user=***
    password=***
   }
}

and in codes (dao files):

@Singleton
class UserDao @Inject()(
                       protected val dbConfigProvider: DatabaseConfigProvider
                       )(implicit val ex: ExecutionContext) extends HasDatabaseConfigProvider[JdbcProfile] {
  import driver.api._
  val userTableQuery = TableQuery[UserTable]

everything works all write such as EVOLUTION that play provided for us.
But if you want to setup other environments such as staging or production you will fail :D.
I read this documentation of Slick you can read it from here that is perfect for writing a successful config file. so I write it like this:

com.my.org {
env = "development"
env = ${?MY_ENV}
development {
  db {
    dataSourceClass = "slick.jdbc.DatabaseUrlDataSource"
    properties = {
      driver = "slick.driver.PostgresDriver$"
      user = "myuser"
      password = "*****"
      url = "jdbc:postgresql://myIP/dbName"
    }
    numThreads = 10
  }
}
staging {
db {
    ip=186.14.*.*
    ...
   }
}
production {
db {
    ip=196.82.*.*
    ...
   }
}
}

** The important thing that you must attention to it, is my PostgreSQL is outside of my (docker container) so I must connect to it remotely.

and in code we have :

    class UserDao @Inject()(
                       )(implicit val ex: ExecutionContext) {

  import driver.api._
  val db = Database.forConfig(s"$prefix.db")
  val userTableQuery = TableQuery[UserTable]

PROBLEM:

Problem is now play evolution does not applied.

QUESTION:

I need to know how to implement one of this (to solve my problems):

  1. how to apply play evolution in this way described before (in problem part) ?
  2. how to setup my environments in better way ?
1

There are 1 best solutions below

0
kian jalali On

A friend of mine consulted me about the problem [over the phone] and here is the solution we came up with:

slick.dbs.default.driver = "slick.driver.PostgresDriver$"
slick.dbs.default.db {
  driver = org.postgresql.Driver
  ip = localhost
  dbName = ***
  user = ***
  password = "***"
  url="jdbc:postgresql://postgresql/"${slick.dbs.default.db.dbName}
}

You can also use Docker to create a docker network and set your PostgreSQL container name instead of your IP address.

Also, if you want to be be able to configure the IP address, say from jenkins or Play_Runtime_Guice, you can use this:

url="jdbc:postgresql://"${?POSTGRESQL_IP}"/dbName"