【问题标题】:Ruby on Rails - Seeding big data (over 2.7M) record to production databaseRuby on Rails - 将大数据(超过 270 万)记录播种到生产数据库
【发布时间】:2018-01-17 07:22:14
【问题描述】:

在我的应用程序中,我有一个 City 模型。我有一个 sql 文件,其中包含世界上所有的城市(超过 270 万),我需要将所有城市播种到我的生产服务器。

我知道我通常可以在seeds.rb 中做到这一点:

cities = City.create([

{id: 1, name: 'Bombuflat',  state_id: 1},
{id: 2, name: 'Garacharma',  state_id: 1},
{id: 3, name: 'Port Blair',  state_id: 1},
// Other cities
])

但由于这是要播种的大数据,因此在每行添加idnamestate_id 需要很长时间。

现在我的cities.sql 有一系列城市,例如:

//id, state_id, name
(1, 1, 'Aixàs'),
(2, 1, 'Aixirivali'),
(3, 1, 'Aixirivall')

最好的方法是什么,所以我不需要在每一行添加idnamestate_id,也许可以使用我已经拥有的数组。

【问题讨论】:

  • 为什么不将 SQL 转储到生产数据库中而不是通过 Rails 执行?
  • 老实说,我不认为应该使用 ActiveRecord 插入这么多数据来进行播种。使用工具将数据批量插入到数据库中。 MySQL 中的LOAD DATA INFILE 可以在几秒钟内使用适度驱动的数据库完成此操作。
  • @Bustkiller 因为在我的生产中我使用 postgresql
  • 尝试使用 CSV 和 PostgreSQL's COPY。它用于快速数据转储/加载。
  • @PavelMikhailyuk 你能否举个例子回答一下,这样我就可以理解并为未来遇到同样问题的人提供帮助。欣赏它

标签: arrays ruby ruby-on-rails-4 seeding


【解决方案1】:

大多数大型 DBMS 都使用批量播种命令扩展 SQL。 COPYPostgreSQL 之一。 COPYINSERT 快得多。

因此,您需要拥有与列名(id、name、statement_id)对应的标题的 CSV 文件。您也可以使用 COPY 从另一个 PostgreSQL DB 获取它。

将其命名为cities.csv 并将其放在db 文件夹中。那么你的seeds.rb 可能看起来像:

csv_path = Rails.root.join('db', 'cities.csv')
copy_clause = "COPY cities FROM '#{csv_path}' WITH(FORMAT CSV, HEADER)"
ActiveRecord::Base.connection.execute(copy_clause)

然后运行rake db:seed

【讨论】:

    【解决方案2】:

    例如做这样的事情:

    unless Rails.env.production?
      connection = ActiveRecord::Base.connection
    
    
      sql = File.read('db/MySQL.sql')
      statements = sql.split(/;$/)
      statements.pop
    
      ActiveRecord::Base.transaction do
        statements.each do |statement|
          connection.execute(statement)
        end
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      相关资源
      最近更新 更多