gpt4 book ai didi

postgresql - Rails 对 csv 格式的原始查询,将通过 Controller 返回

转载 作者:行者123 更新时间:2023-11-29 11:12:31 24 4
gpt4 key购买 nike

我使用事件记录来获取我的故事,然后生成一个 CSV,这是在 Rails cast 中完成的标准方法。但是我有很多行,需要几分钟。我想如果我能让 posgresql 进行 csv 渲染,那么我可以节省一些时间。

这是我现在拥有的:

query = "COPY stories TO STDOUT WITH CSV HEADER;"
results = ActiveRecord::Base.connection.execute(query);

但是这个查询的结果是空的:

 => #<PG::Result:0x00000006ea0488 @connection=#<PG::Connection:0x00000006c62fb8 @socket_io=nil, @notice_receiver=nil, @notice_processor=nil>> 
2.0.0-p247 :053 > result.count
=> 0

更好的了解方式:

2.0.0-p247 :059 >   result.to_json
=> "[]"

我怀疑我的 Controller 看起来像这样:

format.csv { send_data raw_results }

这适用于普通查询,我只是想不出将 CSV 结果返回到 Rails 的 SQL 语法。

更新

将 CSV 导出从 120000 毫秒降低到 290 毫秒

我的模型:

def self.to_csv(story_ids)

csv = []
conn = ActiveRecord::Base.connection.raw_connection
conn.copy_data("COPY (SELECT * FROM stories WHERE stories.id IN (#{story_ids.join(',')})) TO STDOUT WITH (FORMAT CSV, HEADER TRUE, FORCE_QUOTE *, ESCAPE E'\\\\');") do
while row = conn.get_copy_data
csv.push(row)
end
end
csv.join("\r\n")
end

我的 Controller :

send_data Story.to_csv(Story.order(:created_at).pluck(:id))

最佳答案

据我所知,您需要使用 copy_data为此,底层 PostgreSQL 数据库连接上的方法:

- (Object) copy_data(sql)

call-seq:

conn.copy_data( sql ) {|sql_result| ... } -> PG::Result

Execute a copy process for transferring [sic] data to or from the server.

This issues the SQL COPY command via #exec. The response to this (if there is no error in the command) is a PG::Result object that is passed to the block, bearing a status code of PGRES_COPY_OUT or PGRES_COPY_IN (depending on the specified copy direction). The application should then use #put_copy_data or #get_copy_data to receive or transmit data rows and should return from the block when finished.

还有一个例子:

conn.copy_data "COPY my_table TO STDOUT CSV" do
while row=conn.get_copy_data
p row
end
end

ActiveRecord 对原始数据库连接的包装器不知道 copy_data 是什么,但您可以使用 raw_connection打开它:

conn = ActiveRecord::Base.connection.raw_connection
csv = [ ]
conn.copy_data('copy stories to stdout with csv header') do
while row = conn.get_copy_data
csv.push(row)
end
end

这将在 csv 中留下一组 CSV 字符串(每个数组条目一个 CSV 行),您可以 csv.join("\r\n") 获取最终的 CSV 数据。

关于postgresql - Rails 对 csv 格式的原始查询,将通过 Controller 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21126317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com