6

我只想使用 Ruby 的 Sequel 获取 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 不返回它。我应该改用什么方法?

解决方案:(感谢 Josh Lindsey)

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

3 回答 3

9

Dataset#insert方法应该返回最后一个插入 id:

DB[:wv_persons].insert({})

将插入默认值并返回 id。

Database#run将始终返回nil.

于 2010-08-13T15:16:26.487 回答
5

实际上,Database#insert不能保证返回最后插入记录的 id。

从文档中:“...将值插入关联的表中。返回的值通常是插入行的主键值,但这取决于适配器。

于 2013-12-29T16:40:44.357 回答
1

续集 gem应该返回新插入记录的 id,但正如其他人所说:

  • 返回值取决于适配器

我也想补充...

  • 不确定在面对复合主键时要返回什么

#returning你可以通过告诉 sequel 使用该方法应该返回什么来解决这个问题。

例如:

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}]

于 2017-12-12T11:09:25.550 回答