2015-07-06 9 views
6

Ho un errore di compilazione di Scala Non sono riuscito a trovare alcuna informazione per. Sto usando chiazza di petrolio 3.0 e sto ottenendo un errore di compilazione divalore ~ ​​non è un membro di slick.lifted.Rep [Opzione [Int]]

value ~ is not a member of slick.lifted.Rep[Option[Int]]

Credo che la questione riguarda il modo in cui sto usando un opzione di rappresentare il mio campo ID.

Ho provato ad aggiungere id.? al campo id come suggerito in this answer ma ottengo ancora un errore di compilazione nello stesso modo. Qualcosa è cambiato in slick 3.0?

Il mio codice è il seguente:

import slick.driver.H2Driver.api._ 
import scala.concurrent.ExecutionContext.Implicits.global 

case class Recipe(id: Option[Int] = None, name: String, instructions: String, ingredients: String) 

object AddFixtures { 

    class Recipes(tag: Tag) extends Table[Recipe](tag, "recipe") { 
    def id = column[Int]("id", O.PrimaryKey, O.AutoInc) 
    def name = column[String]("name") 
    def instructions = column[String]("instructions") 
    def ingredients = column[String]("ingredients") 

    def * = id ~ name ~ instructions ~ ingredients <> (Recipe, Recipe.unapply _) 
    } 

    val recipes = TableQuery[Recipes] 

    val setup = DBIO.seq(
    recipes.schema.create, 
    recipes += Recipe(None, "Chicken with Avocado", "Mix it up", "Chicken, Avocado") 
) 

    def apply() = { 
    val db = Database.forConfig("h2mem1") 

    try db.run(setup) 
    finally db.close 
    } 
} 

risposta

3

penso che il problema è che alcuni simboli non vengono utilizzati come prima nella chiazza di petrolio 3.0.0

Date un'occhiata here per ulteriori problemi

nel tuo caso la linea problematica sarà qualcosa di simile a seconda di quello che hai intenzione di fare, ma dovrebbe funzionare:

def * = (ID, nome, istruzioni, ingredienti) <> ((Recipe.apply _). tupled, Recipe.unapply _)

Inoltre non è necessario gli impliciti importare

e v'è anche un problema con il parametro opzione [Int]: forse dovrebbe essere migliore:

import slick.driver.H2Driver.api._ 


object SlickStackOverflow extends App { 

} 

case class Recipe(id: Option[Int] = None, name: String, instructions: String, ingredients: String) 

object AddFixtures { 

    class Recipes(tag: Tag) extends Table[Recipe](tag, "recipe") { 
    def id = column[Option[Int]]("id", O.PrimaryKey, O.AutoInc) 
    def name = column[String]("name") 
    def instructions = column[String]("instructions") 
    def ingredients = column[String]("ingredients") 

    def * = (id, name, instructions, ingredients) <> ((Recipe.apply _).tupled, Recipe.unapply _) 
    } 

    val recipes = TableQuery[Recipes] 

    val setup = DBIO.seq(
    recipes.schema.create, 
    recipes += Recipe(None, "Chicken with Avocado", "Mix it up", "Chicken, Avocado") 
) 

    def apply() = { 
    val db = Database.forConfig("h2mem1") 

    try db.run(setup) 
    finally db.close 
    } 
} 

Oppure aggiungere.? per il campo id, whithout utilizzando l'opzione, come si parla nei commenti, penso che questo è meglio aproach

package org.example 

import slick.driver.H2Driver.api._ 

object SlickStackOverflow extends App { 

} 

case class Recipe(id: Option[Int], name: String, instructions: String, ingredients: String) 

object AddFixtures { 

    class Recipes(tag: Tag) extends Table[Recipe](tag, "recipe") { 
    def id = column[Int]("id", O.PrimaryKey, O.AutoInc) 
    def name = column[String]("name") 
    def instructions = column[String]("instructions") 
    def ingredients = column[String]("ingredients") 

    def * = (id.?, name, instructions, ingredients) <> ((Recipe.apply _).tupled, Recipe.unapply _) 
    } 

    val recipes = TableQuery[Recipes] 

    val setup = DBIO.seq(
    recipes.schema.create, 
    recipes += Recipe(None, "Chicken with Avocado", "Mix it up", "Chicken, Avocado") 
) 

    def apply() = { 
    val db = Database.forConfig("h2mem1") 

    try db.run(setup) 
    finally db.close 
    } 
} 
+0

Prova il nuovo codice, ho provato e questo compila, c'è anche un problema con Option, non sono sicuro se hai davvero bisogno di questo – anquegi

+0

Cambiando quella linea e aggiungendo l'opzione [Int] alla colonna id O aggiungendo.? al campo id e non aggiungendo Option funziona. – GoldenFish

+0

Grazie, ho anche aggiunto la terza opzione alla risposta. – anquegi

2

Il field1 ~ field2 costrutto è in realtà costruendo una tupla (field1, field2) sotto il cofano, in modo da @anquegi sottolinea, semplicemente la modifica della tua proiezione * per utilizzare direttamente una tupla funzionerà.

In alternativa, se si desidera utilizzare ~ per costruire la tupla si può tornare indietro importando TupleMethods (come ~was moved out of the normal import scope in Slick 2.0.):

import slick.util.TupleMethods._ 

Vedi anche: Slick 2.0 - update two or more columns

+0

Grazie, stavo cercando quell'importazione :) –