2012-10-17 40 views
1

我想在http://www.genesx.com/2012/06/import-csv-files-100x-faster-in-rails-3/轨Postgres的插入

我想从Postgres的最后插入的指数继Jonaphin给出的示例CSV文件导入数据,但由于某些原因的代码不工作。

def process_data!(file, survey_id) 
headers = [ 
    "zip_code", 
    "booking_date" 
] 
ActiveRecord::Base.establish_connection 

created_at = Time.now.strftime("%Y-%m-%d %H:%M:%S") 

CSV.foreach(file, {headers: :first_row}) do |row| 
    sql_keys = [] 
    sql_vals = [] 

    headers.each_with_index do |key, idx| 
    val = row[idx] 

    sql_keys << key 
    sql_vals << ActiveRecord::Base.connection.quote(val) 
    end 

    sql = " 
    INSERT INTO bookings (survey_id, #{sql_keys.join(', ')}, created_at, updated_at) 
    VALUES (#{survey_id}, #{sql_vals.join(', ')}, '#{created_at}', '#{created_at}') 
    " 

    booking_id = ActiveRecord::Base.connection.insert(sql) 

end 
end 

booking_id现在应该有最后插入行的ID,但由于某种原因,它是nil

我试着在控制台中运行ActiveRecord::Base.connection.insert(sql),它工作正常(即它返回了我想要的ID)。

有人知道这里发生了什么问题吗?是否有一些设置需要更改以允许postgres返回最后一个ID?

回答

1
INSERT INTO bookings (survey_id, #{sql_keys.join(', ')}, created_at, updated_at) 
VALUES (#{survey_id}, #{sql_vals.join(', ')}, '#{created_at}', '#{created_at}') 
returning survey_id 
+0

这很好用 - 谢谢! (虽然应该是“返回ID”) – cit

+0

我一直在使用类似的方法,但在Rails 4.1中,ActiveRecord :: Base.connection已被弃用,并且在SQL语句中使用'RETURNING id'时会引发错误。 – bayendor