Mysql / Ruby Sequel значение последней вставки ID, какой метод? - PullRequest
4 голосов
/ 13 августа 2010

Я просто хочу получить last_insert_id (), используя продолжение Руби:

insertret = @con.run("INSERT INTO `wv_persons` ( `id` ) VALUES ( NULL )")
pp insertret.inspect # returns "nil", expected that..
last_insert_id = @con.run("SELECT LAST_INSERT_ID() AS last_id;")
pp last_insert_id.inspect # returns "nil", should be an ID

Запрос SELECT должен возвращать last_id, но .run не возвращает его.Какой метод я должен использовать вместо?

Решение: (спасибо Джошу Линдси)

last_insert_id = @con[:wv_persons].insert({})
last_insert_id = last_insert_id.to_s
puts "New person ["+ last_insert_id  +"]"

Ответы [ 3 ]

7 голосов
/ 13 августа 2010

Метод Dataset # insert должен возвращать идентификатор последней вставки:

DB[:wv_persons].insert({})

Вставит значения по умолчанию и вернет идентификатор.

База данных # run всегда будет возвращать nil.

5 голосов
/ 29 декабря 2013

На самом деле, База данных # insert не гарантирует возвращение идентификатора последней вставленной записи.

Из документации: "... Вставляет значения в связанную таблицу. Возвращаемое значение обычно является значением первичного ключа для вставленной строки , но оно зависит от адаптера ."

1 голос
/ 12 декабря 2017

гем сиквела должен возвращать идентификатор вновь вставленных записей , но, как говорили другие:

  • возвращаемое значение зависит от адаптера

также я хотел бы добавить ...

  • не уверен, что возвращать при работе с составным первичным ключом

Вы можете обойти это, рассказав сиквелу, что именно нужно вернуть, используя метод #returning.

Например:

DB[:posts].returning(:id).insert(category_id: 5, id: 1, ...)

вернется [{id: 1}]

и

DB[:posts].returning(:id, :category_id).insert(category_id: 5, id: 1, ...)

вернет [{id: 1, category_id: 5}]

...