Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays RubyonRails-将大数据(超过270万条)记录植入生产数据库_Arrays_Ruby_Ruby On Rails 4_Seeding - Fatal编程技术网

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您能给我一个例子来回答这个问题吗?这样我就可以理解了,也可以为将来有同样问题的人提供帮助。感激