Question

N'existe-t-il pas une solution native slick/plainSQL pour récupérer l'identifiant auto-incrémenté de l'INSERT actuel ?

userId est un champ incrémentiel automatique dans ma table MySQL.

sql"""
   INSERT INTO `table`(`email`) 
   OUTPUT INSERTED.userId 
   VALUES ("theEmailAdress@test.de")
""".as[Int].firstOption

De l'aide serait grandement appréciée.

Bravo Oliver

Était-ce utile?

La solution 2

Merci cvogt pour votre aide dans cette discussion.Je pense qu'il serait utile de soumettre un PR, dans la mesure où il s'agit d'une fonctionnalité très courante et utile qui ne devrait pas manquer dans requêtes plainSQL de slick.

Enfin, j'ai trouvé une solution de contournement pour remplacer la fonction native manquante comme suit.

Au cours de la même session, je règle deux requêtes.Le premier est le INSERT déclaration, la deuxième déclaration est SELECT LAST_INSERT_ID() qui renvoie la valeur générée automatiquement la plus récente définie pour le AUTO_INCREMENT colonne par le récemment exécuté INSERT(1).Plus de détails ici : Référence 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
  }
}

Cela fonctionne pour moi en ce moment.S'il y a des améliorations, n'hésitez pas à poster votre solution.

Autres conseils

Cela dépend de la base de données.

Pour MS SQL, c'est SCOPE_IDENTITY(), pour MySQL, c'est LAST_INSERT_ID().Essayez de rechercher un équivalent pour votre base de données si ce n'est rien de ce qui précède.

Ajouté par cvogt:

Il n'existe actuellement aucune fonctionnalité intégrée à Slick pour le SQL simple et aucun moyen d'accéder à l'instruction jdbc sous-jacente lors de l'utilisation de Slick. sql"..." interpolation ou StaticQuery, ce qui vous permettrait d'accéder getGeneratedKeys.Vous pourriez probablement patcher le Interpolateur SQL et Invocateur de déclaration pour permettre cela.Ils ne coûtent que 150 LOC.Cela vaut peut-être la peine d'essayer et de soumettre un PR.

Vous pouvez cependant utiliser l'un des Séance fluide méthode comme withPreparedInsertStatement, qui enveloppe connexion jdbc méthodes pour travailler avec une instruction jdbc.J'ai créé un PR pour ajouter de la documentation à ce sujet : https://github.com/slick/slick/pull/691

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top