gpt4 book ai didi

ruby-on-rails - 如何使用来自字符串而不是文件的 Rails postgresql 连接 raw.put_copy_data

转载 作者:行者123 更新时间:2023-11-29 13:57:41 25 4
gpt4 key购买 nike

我通常使用以下导入模块将数据复制到 rails 中的 postgres 数据库中。

在这种情况下,我上传的文件已准备好供 postgres 复制命令接收。

module Import #< ActiveRecord::Base
class Customer
include ActiveModel::Model
include EncodingSupport

attr_accessor :file

validates :file, :presence => true

def process file=nil
file ||= @file.tempfile
ActiveRecord::Base.connection.execute('truncate customers')
conn = ActiveRecord::Base.connection_pool.checkout
raw = conn.raw_connection
raw.exec("COPY customers FROM STDIN WITH (FORMAT CSV, DELIMITER ',', NULL ' ', HEADER true)")
# open up your CSV file looping through line by line and getting the line into a format suitable for pg's COPY...
data = file.open
data::gets

ticker = 0
counter = 0
success_counter = 0
failed_records = []

data.each_with_index do |line, index|
raw.put_copy_data line
counter += 1
end
# once all done...
raw.put_copy_end
while res = raw.get_result do; end # very important to do this after a copy
ActiveRecord::Base.connection_pool.checkin(conn)
return { :csv => false, :item_count => counter, :processed_successfully => counter, :errored_records => failed_records }
end

我现在有另一个文件需要正确格式化,所以我有另一个模块可以将它从文本文件转换为 csv 文件并删除不必要的内容。准备就绪后,我想将数据传递给上面的模块,并让 postgres 将其存入数据库。

def pg_import file=nil
file ||= @file.tempfile
ticker = 0
counter = 0
col_order = [:warehouse_id, :customer_type_id, :pricelist_id]
data = col_order.to_csv
file.each do |line|
line.strip!
if item_line?(line)
row = built_line
data += col_order.map { |col| row[col] }.to_csv
else
line.empty?
end
ticker +=1
counter +=1
if ticker == 1000
p counter
ticker = 0
end

end

pg_import data

end

我的问题是'process'方法返回数据为

"warehouse_id,customer_type_id,pricelist_id\n201,A01,0AA\n201,A02,0AC

这意味着当我将它传递给 pg_import 时,我无法遍历数据。因为它希望它采用以下格式。

[0] "201,A01,0AA\r\n",
[1] "201,A02,0AC\r\n",
[2] "201,A03,oAE\r\n"

我可以使用什么命令来转换字符串数据,以便我可以在

data.each_with_index 做 |line, index|
raw.put_copy_data 行
计数器 += 1
结束

??

可能有一个非常简单的解决方案,但只是希望在没有文件迭代的情况下无法使用 put_copy_data...

最佳答案

在循环之前和循环内用这个过程解决了这个问题。

data = CSV.parse(data)
data.shift

data.each_with_index do |line, index|
line = line.to_csv
raw.put_copy_data line
counter += 1
end

使用 csv 将字符串转换为数组数组。转移以摆脱标题行。这使我可以遍历数组。获取一个数组并将该数组从数组转换回 csv 字符串,然后将其传递到数据库中。

关于ruby-on-rails - 如何使用来自字符串而不是文件的 Rails postgresql 连接 raw.put_copy_data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28230015/

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