使用Ruby和Sinatra,如何上传csv文件并将每一行插入postgres数据库?
我正在使用Sequel、Sinatra、Postgres和ruby。我有一个上传csv文件的表单,它运行良好,问题是解析csv文件中的字段并将其插入postgres数据库。csv文件的结构如下所示:使用Ruby和Sinatra,如何上传csv文件并将每一行插入postgres数据库?,ruby,postgresql,csv,sinatra,Ruby,Postgresql,Csv,Sinatra,我正在使用Sequel、Sinatra、Postgres和ruby。我有一个上传csv文件的表单,它运行良好,问题是解析csv文件中的字段并将其插入postgres数据库。csv文件的结构如下所示: first,last,designation,email,phone,company,remarks,owner,date John,McAndrew,CEO,debra.wagman@callcreditgroup.com,44 113 388 4300,Callcredit Informatio
first,last,designation,email,phone,company,remarks,owner,date
John,McAndrew,CEO,debra.wagman@callcreditgroup.com,44 113 388 4300,Callcredit Information Group,none,tim@xxxx.jp,now()
postgres数据库具有相同的字段
我想保留标题,然后循环遍历记录(可能有100条)并插入到数据库中。我只是先用一个字段进行实验,然后需要插入所有字段。到目前为止,我掌握的ruby代码是:
require 'csv'
post '/upload' do
file_data = params[:myfile][:tempfile].read
#file_data = params[:file].read
csv_rows = CSV.parse(file_data, headers: true)
owner = 'tim@xxxx.jp'
csv_rows.map do |row|
{firstname => row[:first]}
DB[:prospects].insert( :first => firstname, :owner => owner )
end
end
这不起作用,我得到这样一个结果:PG::UndefinedColumn:ERROR:列“firstname”不存在
然后我试着:
require 'csv'
post '/upload' do
file_data = params[:myfile][:tempfile].read
#file_data = params[:file].read
csv_rows = CSV.parse(file_data, headers: true)
owner = 'tim@xxxx.jp'
csv_rows.each do |row|
DB[:prospects].insert( :first => row[:first], :owner => owner )
end
end
它不返回错误,但只插入变量所有者,它完全忽略行[:first]或找不到它
什么是正确的方法?谢谢
这是有效的(在SoulRebel的帮助下):
经过反复试验,我发现这也是可行的:
post '/uploading' do
file_data = params[:myfile][:tempfile].read
csv_rows = CSV.parse(file_data, headers: true, header_converters: :symbol)
owner = 'tim@xxxx.jp'
remarks = 'none yet'
csv_rows.each do |row|
DB[:prospects].insert( :first => row[:first], :last => row[:last], :designation => row[:designation], :email => row[:email], :phone => row[:phone], :company => row[:company], :industry => row[:industry], :city => row[:city], :country => row[:country], :status => row[:status], :remarks => remarks, :owner => owner )
end
return "File successfully uploaded"
end
注意添加了“标题\转换器::符号”
一如既往,感谢SO社区。尝试以下方法:
CSV.foreach($csv_fname, :headers => true) do |csv_obj|
puts csv_obj['first'] #just to verify that parsing is working well
DB[:prospects].insert( :first => cvs_obj['first'], :owner => csv_obj['owner'] )
end
看起来很酷,谢谢。我会尝试一下,然后给你一个漂亮的绿色勾号反馈,如果它有效的话。我很感谢你的帮助和建议。谢谢你稍加修改,效果很好。我已经修改了上面的代码,以反映您的建议并呈现正确工作的代码片段。另外,值得注意的是,包含header_converters::symbol解决了所有问题。
CSV.foreach($csv_fname, :headers => true) do |csv_obj|
puts csv_obj['first'] #just to verify that parsing is working well
DB[:prospects].insert( :first => cvs_obj['first'], :owner => csv_obj['owner'] )
end