Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用csv文件更新数据库中的特定行?(rails)_Mysql_Ruby On Rails_Csv_Rake_Rails Activerecord - Fatal编程技术网

Mysql 如何使用csv文件更新数据库中的特定行?(rails)

Mysql 如何使用csv文件更新数据库中的特定行?(rails),mysql,ruby-on-rails,csv,rake,rails-activerecord,Mysql,Ruby On Rails,Csv,Rake,Rails Activerecord,我使用csv文件作为MySQL数据库的初始数据。下面的方法是针对该导入过程的。我之前在这里stackoverflow中询问过它,因此可能是因为我直到现在才完全理解该过程 # lib/tasks/import.rake require 'csv' namespace :db do task :restaurants => :environment do CSV.foreach('public/seed_data/restaurants.csv') do |row|

我使用csv文件作为MySQL数据库的初始数据。下面的方法是针对该导入过程的。我之前在这里stackoverflow中询问过它,因此可能是因为我直到现在才完全理解该过程

# lib/tasks/import.rake
require 'csv'

namespace :db do
  task :restaurants => :environment do
    CSV.foreach('public/seed_data/restaurants.csv') do |row|
      record = Restaurant.new(
        :name => row[0],
        :addr => row[1]
      )
      record.save!
    end
  end
end
但是现在我必须更新一些特定的行,这些行在我的第一次db导入之后发生了更改。所以我只是改变了我的第一个方法,如下所示。My update.csv文件的id、nameupdated和AddRuUpdate列没有标题

# lib/tasks/import.rake
require 'csv'

namespace :db do
  task :restaurants_update => :environment do
    CSV.foreach('public/seed_data/update.csv') do |row|
      n = row[0]
      record = Restaurant.find(n)
      record.update_attributes(
        :name => row[1],
        :addr => row[2]
      )
      record.save!
    end
  end
end
我认为它可以读取第[0]行的特定行,该行具有要更新的餐厅id,然后使用以下箭头[1]和第[2]行更新名称和地址。然而,当我进行rake db:restaurants\u更新时,它会说ActiveRecord::RecordNotFound:找不到id为1000001的餐厅这是我在csv文件中的第一行,我的数据库中有这个id为1000001的记录。我在console餐厅查过了。Find10000001。我想import.rake可能丢失了我的记录。无法读取现有数据库吗


有人能指出我的错误吗?

如果您只是在更新,请使用find\u byid:n。就个人而言,我建议使用find_或create_by,如果字段不存在,则更新字段或创建新字段

# lib/tasks/import.rake
require 'csv'

namespace :db do
  task :restaurants_update => :environment do
    CSV.foreach('public/seed_data/update.csv') do |row|
      n = row[0]
      record = Restaurant.find_or_create_by(id: n)
      record.update_attributes(
        :name => row[1],
        :addr => row[2]
      )
      record.save!
    end
  end
end

我不确定,但是,你可以尝试使用Restaurant.find_by_idn吗?我认为CSV中存储的值的格式不同。你可以检查行[0]的值,行是散列,因此r_hash=row.to_hash,rest=Restaurant.whereid:r_hash[id],rest.first.update_attributesr_hash@Sontya我尝试了你所说的,得到了这个命名错误:未定义的散列方法[1000001,nil,nil]:数组。对吗?当我试图通过\u idSensory dude查找\u时,我得到了nil:NilClass的NoMethodError:undefined方法“update\u attributes”,行是数组n=行[0],record=Restaurant.whereid:n,record.first.update\u attributes你想更新的属性,试试这个如果它对你的评论有效的话,我可以试试,我也不知道查找方法会有问题。但是同样的错误,没有针对nil的方法会弹出…………还有其他建议吗R