Arrays RubyonRails-将大数据(超过270万条)记录植入生产数据库
在我的应用程序中,我有一个Arrays RubyonRails-将大数据(超过270万条)记录植入生产数据库,arrays,ruby,ruby-on-rails-4,seeding,Arrays,Ruby,Ruby On Rails 4,Seeding,在我的应用程序中,我有一个城市模型。我有一个sql文件,其中包含了世界上所有的城市(超过270万个城市)&我需要将它们全部植入我的生产服务器 我知道通常我可以在种子中这样做。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}, // Othe
城市
模型。我有一个sql
文件,其中包含了世界上所有的城市(超过270万个城市)&我需要将它们全部植入我的生产服务器
我知道通常我可以在种子中这样做。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
])
但由于这是一个需要播种的大数据,在每一行添加id
,name
,state\u id
需要很长时间
现在我的城市。sql
有一系列城市,如:
//id, state_id, name
(1, 1, 'Aixàs'),
(2, 1, 'Aixirivali'),
(3, 1, 'Aixirivall')
最好的方法是什么,这样我就不需要在每行中添加
id
,name
,state\u id
,也可以使用我已有的数组。例如,执行以下操作:
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
大多数大型数据库管理系统都使用用于批量种子设定的命令扩展SQL。是
PostgreSQL
one<代码>复制比插入快得多
因此,您需要有CSV
文件,其标题对应于列名(id、name、stated\u id)。您还可以使用COPY
从另一个PostgreSQL数据库获取它
调用它cities.csv
,并将其放入db
文件夹中。然后您的种子.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)
然后运行
rakedb:seed
为什么不将SQL转储到生产数据库中,而不是通过Rails执行呢?老实说,我不认为为了种子设定的目的,应该在ActiveRecord中插入这么多的数据。使用工具将数据大容量插入数据库<在MySQL中,代码>加载数据填充可以在几秒钟内完成这项工作,因为在我的产品中,我使用PostgreSQL尝试使用CSV和PostgreSQL的副本
。这是为了快速数据转储/加载。@PavelMikhailyuk您能给我一个例子来回答这个问题吗?这样我就可以理解了,也可以为将来有同样问题的人提供帮助。感激