Rails的ActiveRecord的:在获得原始插入的id(Rails ActiveRecord:

2019-09-18 02:15发布

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

更新 :嗯,我觉得有一个插件我使用所谓的问题奠定了八达通 。 对不起,扣除一些你的答案..它看起来像我需要找到如何获得这个插件插入的最后一个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

Answer 1:

一般而言,而不是使用connection.execute ,使用connection.insert

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

使用INSERT,而不是执行也清除铁轨查询缓存。

在MySQL至少,这将工作,即使你为自己设定的ID 。



Answer 2:

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

DmozCategory.connection.insert_sql(sql) # => id


Answer 3:

试试这个,这是AR在2.3之前插入如何定义ID

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



Answer 4:

如果是这样的mysql2宝石,和DmozCategory.connection是客户端的一个实例, DmozCategory.connection.last_id会工作。



Answer 5:

既然你知道id已,你就不能这样做呢?

dmoz_category = DmozCategory.find(result['id'])
$stderr.puts dmoz_category.inspect


Answer 6:

假设你正在使用MySQL和表自动递增,你可以使用:

SELECT LAST_INSERT_ID()

做什么它说,抓住最后插入的ID到表中。 这将另一个查询添加到您的代码,但它似乎坚持使用原始的SQL你。



文章来源: Rails ActiveRecord: Getting the id of a raw insert