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

È stato utile?

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_INCREMENTtagCode 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top