Come recuperare l'ID incrementato automaticamente utilizzando slick/plainSQL?
-
21-12-2019 - |
Domanda
Non esiste una soluzione nativa slick/plainSQL per recuperare l'ID incrementato automaticamente dell'INSERT corrente?
userId è un campo incrementale automatico nella mia tabella MySQL.
sql"""
INSERT INTO `table`(`email`)
OUTPUT INSERTED.userId
VALUES ("theEmailAdress@test.de")
""".as[Int].firstOption
L'aiuto sarebbe molto apprezzato.
Saluti Oliver
Soluzione 2
Grazie cvogt per aiutare in questa discussione. Penso che sarebbe utile presentare un PR, in quanto è una funzionalità molto comune e utile che non dovrebbe mancare in Le query Plainsql di Slick's .
Infine, ho trovato un lavoro per sostituire la funzione nativa mancante come segue.
Entro la stessa sessione contengo due query. Il primo è l'istruzione INSERT
, la seconda istruzione è SELECT LAST_INSERT_ID()
che restituisce il nuovo valore generato automaticamente impostato per la colonna AUTO_INCREMENT
tagCode di recente eseguita (1). Maggiori dettagli qui: MySQL Riferimento - Last_insert_id ()
Database.forDataSource(dataSource).withDynSession {
sqlu"""INSERT INTO `users`(`email`) VALUES ("theEmailAdress@test.de")
""".firstOption match {
case Some(num) if num == 1 => sql"SELECT LAST_INSERT_ID()".as[Long].firstOption()
case None => None
}
}
.
funziona per me adesso. Se ci sono dei miglioramenti, non esitate a pubblicare la tua soluzione.
Altri suggerimenti
Dipende dal database.
Per MS SQL è SCOPE_IDENTITY(), per mySQL è LAST_INSERT_ID().Prova a cercare un equivalente per il tuo DB se non è nessuno dei precedenti.
Aggiunto da cvogt:
Al momento non esiste alcuna funzionalità incorporata di slick per SQL semplice per questo e non c'è modo di accedere all'istruzione jdbc sottostante quando si utilizza Slick sql"..."
interpolazione o StaticQuery
, che ti consentirebbe di accedere getGeneratedKeys
.Probabilmente potresti patchare il file Interpolatore SQL E DichiarazioneInvoker per consentire ciò.Sono solo 150 LOC.Forse vale la pena provare e inviare un PR.
Potresti comunque usare uno dei Sessione brillante metodo come withPreparedInsertStatement
, che avvolgono connessione jdbc metodi per lavorare con un'istruzione jdbc.Ho creato un PR per aggiungere documentazione a riguardo: https://github.com/slick/slick/pull/691