Como recuperar o ID incrementado automaticamente usando slick/plainSQL?
-
21-12-2019 - |
Pergunta
Não existe uma solução nativa slick/plainSQL para recuperar o ID incrementado automaticamente do INSERT atual?
userId é um campo incremental automático na minha tabela MySQL.
sql"""
INSERT INTO `table`(`email`)
OUTPUT INSERTED.userId
VALUES ("theEmailAdress@test.de")
""".as[Int].firstOption
A ajuda seria muito apreciada.
Saúde Oliver
Solução 2
Obrigado cvogt por ajudar nesta discussão.Acho que seria útil enviar um PR, na medida em que é uma funcionalidade muito comum e útil que não deveria faltar no consultas plainSQL do slick.
Finalmente, encontrei uma solução alternativa para substituir a função nativa ausente da seguinte maneira.
Dentro da mesma sessão atendo duas dúvidas.O primeiro é o INSERT
afirmação, a segunda afirmação é SELECT LAST_INSERT_ID()
que retorna o valor mais recente gerado automaticamente que foi definido para o AUTO_INCREMENT
coluna pelo executado recentemente INSERT
(1).Mais detalhes aqui: Referência MySQL - 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
}
}
Isso funciona para mim agora.Se houver alguma melhoria, não hesite em postar sua solução.
Outras dicas
Depende do banco de dados.
Para MS SQL é SCOPE_IDENTITY(), para mySQL é LAST_INSERT_ID().Tente procurar equivalente para o seu banco de dados, se não houver nenhuma das opções acima.
Adicionado por cvogt:
Atualmente não há nenhum recurso integrado do Slick para SQL simples para isso e nenhuma maneira de acessar a instrução jdbc subjacente ao usar o Slick's sql"..."
interpolação ou StaticQuery
, o que permitiria que você acessasse getGeneratedKeys
.Você provavelmente poderia corrigir o Interpolador SQL e DeclaraçãoInvoker para permitir isso.Eles custam apenas 150 LOC.Talvez valha a pena tentar e enviar um PR.
No entanto, você pode usar um dos Sessão inteligente método como withPreparedInsertStatement
, que envolve conexão jdbc métodos para trabalhar com uma instrução jdbc.Criei um PR para adicionar documentação sobre isso: https://github.com/slick/slick/pull/691