Slick / PlainSQLを使用して自動インクリメントIDを取得する方法
-
21-12-2019 - |
質問
現在のインサートの自動インクリメントIDを取得するためのslick / plainsqlネイティブソリューションがありませんか?
userIDは、MySQLテーブルの自動増分フィールドです。
sql"""
INSERT INTO `table`(`email`)
OUTPUT INSERTED.userId
VALUES ("theEmailAdress@test.de")
""".as[Int].firstOption
.
ヘルプは大いに感謝されるでしょう。
歓声 オリバー
解決 2
ありがとうございますこの議論での支援のためにCVogt 。 SlickのPlainSQLクエリ
最後に、行方不明のネイティブ関数を以下のように置き換えるための作業を見つけました。
同じセッション内で2つのクエリを解決します。最初のものはINSERT
ステートメントです。このステートメントはSELECT LAST_INSERT_ID()
です。これは、最近実行されたAUTO_INCREMENT
(1)によってINSERT
列に設定された最新の自動生成値を返します。詳細はこちら: 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
}
}
.
これは今私のために働きます。改善がある場合は、解決策を投稿することを躊躇しないでください。
他のヒント
はデータベースによって異なります。
MS SQLの場合はscope_identity()です.MySQLはlast_insert_id()です。 上記のどれでもない場合は、DBと同等のものを検索してみてください。
CVOGT :
現在、Slickのsql"..."
InterpolationまたはStaticQuery
を使用するときに基礎となるjdbcステートメントにアクセスする方法は現在、現在のjdbcステートメントにアクセスする方法はありません。これにより、getGeneratedKeys
にアクセスできます。おそらく SQL Interpolator と statementInvoker 。彼らはわずか150人です。ショットを与えてPRを提出する価値があるかもしれません。
しかし、 slick session メソッドwithPreparedInsertStatement
のようなメソッド。 JDBC接続 JDBCステートメントを操作する方法。これに関するドキュメントを追加するためのPRを作成しました。 https://github.com/slick/slick/pull / 691