Scala Slick delete non funziona
-
20-12-2019 - |
Domanda
quando elimino dal mio oggetto tablequery dovrei essere in grado di scrivere:
FacebookAuths.delete
Ma si lamenta che delete non è un metodo in TableQuery, anche se ci provo:
Users.filter(_.id === 1337).delete
Sta ancora dicendo che delete non è un metodo, ma ora sull'oggetto Query.
Cosa sto facendo di sbagliato?Le mie importazioni sono:
import scala.slick.lifted._
import scala.slick.driver.JdbcDriver.simple._
E tutte le altre cose come firstOption funziona.
Io uso postgres.
Grazie!
Soluzione
Stai usando Postgres
, così Lei ha bisogno di import scala.slick.driver.PostgresDriver.simple._
e scala.slick.driver.PostgresDriver
invece del jdbc
quelli, la stessa cosa si applica a dove è definito il tuo schema.
Modificare:
Questo è un po ' al di fuori della mia conoscenza e non sono sicuro al 100%, ma farò un tentativo.
Il PostgresDriver
tratto estende il JdbcDriver
tratto (da JdbcProfile.scala
), questa è la firma del tratto:
trait PostgresDriver extends JdbcDrive
e a sua volta JdbcDriver
estendere SqlDriver
:
trait JdbcDriver extends SqlDriver
Il firstOption
il metodo appartiene al UnitInvoker
tratto, quindi non dipende dai driver importati, la stessa cosa vale per list
e first
e altri metodi, puoi controllarli Invoker.scala
file.Il delete
il metodo invece è definito nel DeleteInvoker
classe all'interno del JdbcInvokerComponent
tratto.
La mia comprensione è che quando si dichiara un TableQuery
oggetto questa è la firma completa:
val table: PostgresDriver.simple.TableQuery[MyTable] = TableQuery[MyTable]
Mentre stai dichiarando una tabella con questa firma:
val table: JdbcDriver.simple.TableQuery[MyTable] = TableQuery[MyTable]
Non capisco perché il delete
il metodo non è disponibile per Jdbc
direttamente, probabilmente devi usare Query
per questo e quindi utilizzare Query.deleteInvoker
, ma come ho detto non sono sicuro, sembra confuso anche a me.