【问题标题】:Seeding a Rails Database with Pre-set IDs使用预设 ID 播种 Rails 数据库
【发布时间】:2010-05-05 12:01:43
【问题描述】:

我有一个包含种子数据的 XML 文件,我正在尝试将其加载到我的生产数据库中。

问题是我在 XML 文件中的不同数据类型/节点之间有关联,因此当从 Rails 加载到 MySQL 时,我需要指定的 ID 相同。

这在开发过程中可以很好地使用 SQLite,我只是在遍历 XML 文件中的每个节点后使用如下一行:

CardSet.connection.execute("UPDATE card_sets SET id = #{xml_set.attributes['id']} WHERE id = #{set.id}")

我的问题是:如何在为数据库播种时强制使用预设 ID,然后才能重新打开 auto_increment 以使 Rails 正常运行?

在创建数据库条目之前,我已经用这两行尝试过:

CardSet.connection.execute("ALTER TABLE card_sets CHANGE id id INT(11) DEFAULT NULL")
CardSet.connection.execute("ALTER TABLE card_sets DROP PRIMARY KEY")

之后:

CardSet.connection.execute("ALTER TABLE card_sets CHANGE id id INT(11) DEFAULT NULL auto_increment PRIMARY KEY")

哪个 MySQL 向我回击:

Mysql::Error: ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '18' for key 'PRIMARY': ALTER TABLE card_sets CHANGE id id INT(11) DEFAULT NULL auto_increment PRIMARY KEY

我的架构:

create_table "card_sets", :force => true do |t|
  t.string   "name"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "card_sets_cards", :id => false, :force => true do |t|
  t.integer "card_set_id"
  t.integer "card_id"
end

create_table "cards", :force => true do |t|
  t.text     "question",   :default => ""
  t.text     "answer",     :default => ""
  t.datetime "created_at"
  t.datetime "updated_at"
end

和模型:

class CardSet < ActiveRecord::Base
  has_and_belongs_to_many :cards, :uniq => true
end

class Card < ActiveRecord::Base
    has_and_belongs_to_many :card_set, :uniq => true
end

任何想法都将不胜感激。

【问题讨论】:

    标签: mysql ruby-on-rails auto-increment seed


    【解决方案1】:

    我解决MySQL错误的方法是正常创建模型实例(CardSet.create),然后强制更新ID,然后重新加载实例:

    c = CardSet.create(...blah....)
    CardSet.connection.execute("UPDATE card_sets SET id = #{real_card_set_id} WHERE id = #{c.id}")
    c = CardSet.find(real_card_set_id)
    c.save!
    

    【讨论】:

    • 为什么ID已经改完还要保存在最后?
    【解决方案2】:

    如果您以块形式创建对象,它会起作用。

    p = Post.new do |post|
      post.id = 1000
    end
    
    p.save
    

    【讨论】:

    • Rails 似乎可以很好地获取 ID,但是如果我重新加载实例,Rails 找不到它,因为 MySQL 给它的 ID 为 0。
    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    相关资源
    最近更新 更多