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

resnilDmozCategory がデータベースに挿入されていることがわかりますが、常にです。id次の私の挿入物 を取得するにはどうすればよいですか?

別の SQL クエリSELECT LAST_INSERT_ID()を使用して ID を取得できることはわかっていますが、Rails を介して ID を取得する方法があるかどうか疑問に思っていました。M

背景: 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
4

6 に答える 6

14

connection.execute一般に、 を使用する代わりに、connection.insert

これは、最後に挿入された行の生成された ID を返します。これがどのように行われるかは、データベースに依存します。MySQL では、最後の挿入 ID は接続のプロパティです。Postgres では、'returning' 句がクエリに追加されます (postgres の古いバージョンでは、フォールバックが最後の ID をシーケンスに要求します)。

実行ではなく挿入を使用すると、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

これを試してください。これは、ARが2.3で挿入する前にidを定義する方法です

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

于 2012-06-19T08:23:50.837 に答える
0

これが mysql2 gem でありDmozCategory.connection、クライアントのインスタンスである場合はDmozCategory.connection.last_id機能します。

于 2012-06-20T18:27:44.237 に答える
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 に答える