【问题标题】:Bulk insert of parent/children at the same time同时批量插入父/子
【发布时间】:2016-06-23 12:38:13
【问题描述】:

我正在尝试对 MySQL DB 表执行一对父/子模型的bulk insert,但似乎我无法使用标准的 ActiveRecord 功能来做到这一点。 所以,我尝试了 activerecord-import gem,但它也不支持 MySQL 的递归插入......

# Book has_many authors / Author belongs to Book
books = []
10000.times do |i| 
  book = Book.new(:name => "book #{i}")
  book.author.build(:name => "author #{i}")
  books << book
end
Book.import books, recursive: true # THIS DOES NOT WORK

我也尝试使用原始 SQL 来实现它,但我无法找到一种方法来保留每个父/子的引用,因为在我想插入子数据时,它的父没有它的 id还没有。
有谁知道我该如何解决这个问题?

【问题讨论】:

  • 批量插入意味着什么?您希望数据库对所有这些数据进行一次插入,还是全部由它自己处理插入,不管它死了多少查询?
  • 我只想创建一个 INSERT 语句。像 INSERT INTO *** VALUES (), (), ......(10000 Times)

标签: mysql ruby-on-rails activerecord


【解决方案1】:

请这样试试:

books = []
10000.times do |i| 
  book.name = "book #{i}")
  books << book
end
Book.import books // Here it creates Books

我不确定您如何进一步创建作者...

【讨论】:

    【解决方案2】:

    你必须使用嵌套属性

    在书本模型中

    accepts_nested_attributes_for :author
    

    你可以用下一个方法来做

    books = []
    10_000.times do |i| 
      books << { name: "book #{i}", author_attributes: { name: "author_#{i}" }
    end
    
    Book.create(books) # it will create all object in single transaction
    

    【讨论】:

    • 感谢您的回答。你说这是一个单一的交易,但在我的理解中,它仍然会创建 10000 次 INSERT 语句。 (如果我错了,请告诉我)我所说的“批量插入”是用一个带有一堆 VALUES 的 INSERT 语句来实现它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多