7
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。我完整的coe:

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
4

6 回答 6

14

一般来说,不要使用connection.execute,使用connection.insert

这将返回最后插入的行的生成 id。它如何做到这一点取决于数据库。在 MySQL 上,最后一个插入 id 是连接的属性。在 Postgres 上,“返回”子句被附加到查询中(对于旧版本的 postgres,后备会询问序列的最后一个 id)。

使用 insert 而不是 execute 也会清除 rails 查询缓存。

至少在 MySQL 上,即使你自己设置了 id 也可以

于 2012-06-20T08:22:29.397 回答
1

我认为insert_sql方法应该可以帮助你

DmozCategory.connection.insert_sql(sql) # => id
于 2012-06-22T17:28:38.667 回答
0

如果这是 mysql2 gem,并且DmozCategory.connection是客户端的实例,DmozCategory.connection.last_id则可以使用。

于 2012-06-20T18:27:44.237 回答
0

try this, that is how AR defines id before insert in 2.3

id = DmozCategory.connection.next_sequence_value(DmozCategory.sequence_name)

于 2012-06-19T08:23:50.837 回答
0

既然你id已经知道了,你就不能这样做吗?

dmoz_category = DmozCategory.find(result['id'])
$stderr.puts dmoz_category.inspect
于 2012-06-25T00:38:25.810 回答
-1

假设您使用的是 MYSQL 并且表自动递增,您可以使用:

SELECT LAST_INSERT_ID()

按照它所说的,将最后插入的 ID 抓取到表中。这会在您的代码中添加另一个查询,但它似乎坚持使用原始 SQL。

于 2012-06-14T04:31:14.900 回答