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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top