- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我通常使用以下导入模块将数据复制到 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/
我通常使用以下导入模块将数据复制到 rails 中的 postgres 数据库中。 在这种情况下,我上传的文件已准备好供 postgres 复制命令接收。 module Import # true
我是一名优秀的程序员,十分优秀!