Andy
Andy

Reputation: 55

connecting slick 3.1.1 to the database

I have the following code and I'm trying to connect to the MySQL database without success.

cat Database.scala

package com.github.odnanref.EmailFilter

import slick.driver.MySQLDriver._
import slick.driver.MySQLDriver.backend.Database

/**
  * Created by andref on 12/05/16.
  */
class Database {
  val url = "jdbc:mysql://localhost/playdb"
  val db = Database.forURL(url, driver = "com.mysql.jdbc.Driver")

  override def finalize() {
    db.close()

    super.finalize()
  }
}

cat EmailMessageTable.scala

package com.github.odnanref.EmailFilter

import java.sql.Timestamp

import slick.driver.JdbcProfile
import slick.driver.MySQLDriver.api._

import scala.concurrent.Future

class EmailMessageTable(tag: Tag) extends Table[EmailMessage](tag, "email_message") {

  def id      = column[Option[Long]]("id", O.AutoInc, O.PrimaryKey)
  def email   = column[String]("email")
  def subject = column[String]("subject")
  def body    = column[String]("body")
  def datain  = column[Timestamp]("datain")
  def email_id= column[Long]("email_id")

  def * = (id, email, subject, body, datain, email_id) <> ((EmailMessage.apply _).tupled, EmailMessage.unapply)
  def ? = (id.get.?, email.?, subject.?, body.?, datain.?).shaped.<>({ r =>; _1.map(_ =>
    EmailMessage.tupled((_1, _2.get, _3.get, _4.get, _5.get))) }, (_: Any) =>
    throw new Exception("Inserting into ? projection not supported."))
}

I can't initialize the database and execute search query's or insert statements based on this code I try to do

val db = new Database()
db.db.run(TableQuery[EmailMessageTable] += EmailMessage(...) )
And it says, it doesn't know the method +=

Also I get this error:

Database.scala:4: imported `Database' is permanently hidden by definition of class Database in package EmailFilter
[warn] import slick.driver.MySQLDriver.backend.Database

What am I doing wrong?

Post EDIT>

package com.github.odnanref.EmailFilter

import java.sql.Timestamp


case class EmailMessage(
  id: Option[Long], 
  email: String, 
  subject:String,
  body:String,
  datain: Timestamp,
  email_id: Long
)

Upvotes: 0

Views: 1467

Answers (1)

Paweł Jurczenko
Paweł Jurczenko

Reputation: 4471

You are importing a class named Database inside a file that defines another class with the same name. You can:

  • rename your Database class:

    class MyDatabase {
     val url = ...
     val db = ...
     ...
    }
    
  • rename imported class:

    import slick.driver.MySQLDriver.backend.{Database => SlickDB}
    ...
    val db = SlickDB.forURL(url, driver = "com.mysql.jdbc.Driver")
    
  • avoid importing Database explicitly:

    import slick.driver.MySQLDriver.backend
    ...
    val db = backend.Database.forURL(url, driver = "com.mysql.jdbc.Driver")
    

Upvotes: 1

Related Questions