Slick

Slick getting started code

In build.sbt, make sure you include (here for Mysql and PostGreSQL):

 "mysql" % "mysql-connector-java" % "5.1.20",  
 "org.postgresql" % "postgresql" % "9.3-1100-jdbc4",
 "com.typesafe.slick" %% "slick" % "3.1.1",
 "com.typesafe.play" %% "play-slick" % "1.1.1"

In your application.conf, add:

mydb.driverjava="slick.driver.MySQLDriver$"
mydb.driver="com.mysql.jdbc.Driver"
mydb.url="jdbc:mysql://hostaddress:3306/dbname?zeroDateTimeBehavior=convertToNull"
mydb.user="username"
mydb.password="password"

To have a RDBMS independent architecture create an object like the following

package mypackage

import slick.driver.MySQLDriver
import slick.driver.PostgresDriver
 
object SlickDBDriver{
  val env = "something here"
  val driver = env match{
    case "postGreCondition" => PostgresDriver
    case _                  => MySQLDriver
  }
}

when creating a new new model:

import mypackage.SlickDBDriver.driver.api._
import slick.lifted.{TableQuery, Tag}
import slick.model.ForeignKeyAction

case class MyModel(
  id: Option[Long],
  name: String
) extends Unique


class MyModelDB(tag: Tag) extends IndexedTable[MyModel](tag, "my_table"){
  def id              = column[Long]("id", O.PrimaryKey, O.AutoInc)
  def name            = column[String]("name")
  
  def * = (id.? , name) <> ((MyModel.apply _).tupled, MyModel.unapply _)
}

class MyModelCrud{
   import play.api.Play.current

   val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
   val db =  dbConfig.db

   val query = TableQuery[MyModelDB]
   
   // SELECT * FROM my_table;
   def list = db.run{query.result}
}

Output DDL

The whole point of using slick is to write as little SQL code as possible. After you have written your table definition, you will want to create the table in your database.

If you have val table = TableQuery[MyModel] You can get the table definition (SQL code - DDL) running the following command:

import mypackage.SlickDBDriver.driver.api._
table.schema.createStatements