【问题标题】:rake db:seed unable to read CSVrake db:seed 无法读取 CSV
【发布时间】:2015-02-15 12:15:21
【问题描述】:

我打算从 CSV 文件填充我的 PostgreSQL 数据库,但是当我这样做 rake db:seed 时,我收到了这个错误:

rake aborted!
ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: ERROR:  could not open file "/home/spondbob/projects/rhsystem/db/data/doctors.csv" for reading: Permission denied
: COPY doctors(
    name,
    address,
    phone,
    field_id,
    is_active,
    email,
    encrypted_password,
    reset_password_token,
    reset_password_sent_at,
    remember_created_at,
    sign_in_count,
    current_sign_in_at,
    last_sign_in_at,
    current_sign_in_ip,
    last_sign_in_ip) 
FROM '/home/spondbob/projects/rhsystem/db/data/doctors.csv' WITH DELIMITER ',' CSV HEADER
/home/spondbob/.rvm/gems/ruby-2.1.5@rhsystem/gems/activerecord-4.1.8/lib/active_record/connection_adapters/postgresql/database_statements.rb:128:in `async_exec'

...

我不知道为什么它没有读取权限,我已经确定权限在那里并且数据库连接建立良好。这是文件权限:

$ ls -l db/data                     
total 56
-rwxr-xr-x 1 spondbob users   775 Dec 17 12:46 doctors.csv
...

还有我的seeds.rb 第一张桌子:

connection = ActiveRecord::Base.connection()
connection.execute("COPY doctors(
    name,
    address,
    phone,
    field_id,
    is_active,
    email,
    encrypted_password,
    reset_password_token,
    reset_password_sent_at,
    remember_created_at,
    sign_in_count,
    current_sign_in_at,
    last_sign_in_at,
    current_sign_in_ip,
    last_sign_in_ip) 
FROM '#{Rails.root.join('db','data')}/doctors.csv' WITH DELIMITER ',' CSV HEADER")

感谢任何帮助。谢谢。

【问题讨论】:

  • /home/spondbob/rhsystem 也是世界可读/可执行的吗?如果其中任何部分不是,那么它将失败。
  • 根文件夹实际上是/home/spondbob/projects/rhsystem,我已经更正了。是的,它也有 r/x。
  • 我刚刚发现用户postgres无法访问/home/spondbob,即使我已将其放入群组users

标签: ruby-on-rails postgresql csv rake


【解决方案1】:

为此创建一个 rake 任务:

desc "Imports a CSV file into an ActiveRecord table"
task :csv_import, :filename, :model, :needs => :environment do |task,args|
  lines = File.new(args[:filename]).readlines
  header = lines.shift.strip
  keys = header.split(',')
  lines.each do |line|
    params = {}
    values = line.strip.split(',')
    keys.each_with_index do |key,i|
      params[key] = values[i]
    end
    Module.const_get(args[:model]).create(params)
  end
end

然后像这样使用它:

rake csv_import file.csv 模型

【讨论】:

  • 感谢@Paulo 为您解答,但我刚刚发现了问题所在。是/home/spondbob的权限是700。这就是为什么users组没有权限r/x。
  • @spondbob 是的,但是这样你总是在改变权限。请记住,如果您更改服务器,则需要设置权限,而不是在某处上传文件。
  • 这是一个很好的建议,谢谢队友。我会记下这个。
猜你喜欢
  • 1970-01-01
  • 2011-02-08
  • 2015-07-11
  • 2015-07-13
  • 2015-10-12
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多