2

我使用一点 ruby​​ 脚本和 mysql2 gem 从 mysql 数据库中导出以下内容

require 'csv'
require 'mysql2'

begin
    db = Mysql2::Client.new( :host => ".", :username => "xyz", :password => 'xyz', :database => 'xyz')

    results = db.query 'select * from mytable'

    CSV.open("C:/tmp/mytable.csv", "w") do |csv|
        csv << results.fields

        results.each do |row|
            csv << row.values
        end
    end
end

这适用于小桌子,但我认为我应该为大桌子做不同的事情。我在这里可能是错的,但它似乎将整个表格读入内存,然后一口气将其全部写入。如果我有一个包含数千万行的巨大表,我想不断地流式传输到文件中。

我该怎么做呢?

我尝试对一个有约 1000 万行的表运行它并得到以下结果

[FATAL] failed to allocate memory

我已经找到,如果它有效,将报告

result = client.query("SELECT * FROM really_big_Table", :stream => true)
4

2 回答 2

3

答案确实是这样,问题是读取数据库表

results = db.query( 'select * from mytable',  :stream => true, :cache_rows => false )

csv 的写入是异步完成的

于 2013-07-17T08:26:30.413 回答
2

这可能不是您正在寻找的 Ruby 解决方案,但它是一种解决方案:

MySQL 支持直接输出到 CSV 文件。在您的情况下,如果您只需要一个 CSV 转储,那么最有效的方法可能是运行这样的查询:

SELECT * FROM mytable
  INTO OUTFILE 'C:\\tmp\\mytable.csv'
  FIELDS TERMINATED BY ','
  ENCLOSED BY '"'
  LINES TERMINATED BY '\r\n'

如果 MySQL 服务器与输出文件位于同一台计算机上,则此方法有效,因为它将是写入文件的服务器,而不是客户端。

http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/

于 2013-07-16T19:10:12.593 回答