sql = DmozCategory.send(:sanitize_sql_array, ["INSERT INTO dmoz_categories (id, dmoz_category_title, dmoz_category_name, dmoz_category_description, created_at, updated_at, dmoz_category_lastupdate) VALUES (?, ?, ?, ?, NOW(), NOW(), ?)", result['catid'], result['title'], result['name'], result['description'], result['lastupdate']])
res = DmozCategory.connection.execute(sql)
$stderr.puts res.inspect
res
总是nil
,即使我可以看到DmozCategory插入到数据库中。如何在插入后获得id
?
我意识到我可以使用另一个SQL查询SELECT LAST_INSERT_ID()
来获取ID,但我想知道是否有办法通过Rails获取id。中号
背景:使用Rails 2.3.14
更新:嗯,我认为问题在于我使用的名为Octopus的插件。很抱歉打折你的一些答案..看起来我需要找到如何使用此插件获取插入的最后一个ID。我的完整系数:
desc "load all categories from dmoz" # With this one we're loading all the 'structure' table in, not the parent-child relationships.
task :load_categories_from_dmoz, [ :offset, :limit ] => :environment do |t, args|
offset = !args[:offset].blank? ? args[:offset].to_i : 0 # Take offset from args. Default of 0
limit = !args[:limit].blank? ? args[:limit].to_i : 1 # Take limit from args. Default of 1
ActiveRecord::Base.octopus_establish_connection(:adapter=> "mysql", :host=> "localhost", :database => "dmoz", :username => "dmoz", :password => "dmoz")
results = ActiveRecord::Base.connection.select_all("SELECT * FROM structure LIMIT #{ offset }, #{ limit }") # Fetches it directly from the dmoz database.
count = offset
conn = ActiveRecord::Base.octopus_establish_connection(:adapter=> "mysql", :host=> "localhost", :database => "talon_development", :username => "rails_shadow", :password => "husky")
results.each do |result|
if count % 1000 == 0
puts count
end
count +=1
begin
sql = DmozCategory.send(:sanitize_sql_array, ["INSERT INTO dmoz_categories (id, dmoz_category_title, dmoz_category_name, dmoz_category_description, created_at, updated_at, dmoz_category_lastupdate) VALUES (?, ?, ?, ?, NOW(), NOW(), ?)", result['catid'], result['title'], result['name'], result['description'], result['lastupdate']]) #We leave parent_id NULL for the next task to handle relationships
DmozCategory.connection.execute(sql) #doesn't get the ID..
end
end
end
答案 0 :(得分:12)
通常使用connection.execute
connection.insert
这将返回最后插入行的生成ID。它是如何做到这一点依赖于数据库。在MySQL上,最后一个插入ID是连接的属性。在Postgres上,一个'returns'子句被附加到查询中(对于postgres的旧版本,后备会询问序列的最后一个id)。
使用insert而不是execute也会清除rails查询缓存。
至少在MySQL上,这将有效even if you set the id yourself。
答案 1 :(得分:1)
我认为insert_sql
方法可以帮助你
DmozCategory.connection.insert_sql(sql) # => id
答案 2 :(得分:0)
试试这个,这就是AR在插入2.3之前定义id的方式
id = DmozCategory.connection.next_sequence_value(DmozCategory.sequence_name)
答案 3 :(得分:0)
如果这是mysql2 gem,DmozCategory.connection
是客户端的实例,DmozCategory.connection.last_id
将起作用。
答案 4 :(得分:0)
既然您已经知道id
,那么您不能这样做吗?
dmoz_category = DmozCategory.find(result['id'])
$stderr.puts dmoz_category.inspect
答案 5 :(得分:-1)
假设您正在使用MYSQL并且表格自动递增,您可以使用:
SELECT LAST_INSERT_ID()
按照说法执行操作,将最后插入的ID抓取到表中。这会为您的代码添加另一个查询,但它似乎坚持使用您的原始SQL。