كيفية استرداد المعرف المتزايد تلقائيًا باستخدام slick/plainSQL؟

StackOverflow https://stackoverflow.com//questions/22013105

سؤال

أليس هناك حل أصلي slick/plainSQL لاسترداد المعرف المتزايد تلقائيًا لـ INSERT الحالي؟

معرف المستخدم هو حقل تزايدي تلقائي في جدول MySQL.

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

المساعدة ستكون موضع تقدير كبير.

هتاف أوليفر

هل كانت مفيدة؟

المحلول 2

شكرًا لك com.cvogt للمساعدة في هذه المناقشة.أعتقد أنه سيكون من المفيد تقديم العلاقات العامة، لأنها وظيفة شائعة ومفيدة للغاية والتي لا ينبغي أن تكون مفقودة في استعلامات SQL العادية الخاصة بـ Slick.

وأخيرا، وجدت حل بديل لاستبدال الوظيفة الأصلية المفقودة على النحو التالي.

في نفس الجلسة قمت بتسوية استفسارين.الأول هو INSERT البيان، والبيان الثاني هو SELECT LAST_INSERT_ID() والتي تُرجع أحدث قيمة تم إنشاؤها تلقائيًا والتي تم تعيينها لـ AUTO_INCREMENT العمود الذي تم تنفيذه مؤخرًا INSERT(1).مزيد من التفاصيل هنا: مرجع 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().حاول البحث عن ما يعادل قاعدة البيانات الخاصة بك إذا لم يكن أيًا مما سبق.

أضيف بواسطة cvogt:

لا توجد حاليًا ميزة مضمنة في slick لـ SQL العادي لهذا ولا توجد طريقة للوصول إلى بيان jdbc الأساسي عند استخدام Slick's sql"..." الاستيفاء أو StaticQuery, ، والتي من شأنها أن تسمح لك بالوصول getGeneratedKeys.ربما يمكنك تصحيح مُحرف SQL و StatementInvocer للسماح بهذا.هم فقط 150 LOC.ربما يستحق إعطاء فرصة وتقديم العلاقات العامة.

ومع ذلك، يمكنك استخدام أحد جلسة سلسة طريقة مثل withPreparedInsertStatement, ، الذي التفاف اتصال jdbc طرق العمل مع بيان Jdbcلقد قمت بإنشاء علاقات عامة لإضافة وثائق حول هذا: https://github.com/slick/slick/pull/691

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top