【问题标题】:using COPY FROM in a Rails app on Heroku with the Postgresql backend在带有 Postgresql 后端的 Heroku 上的 Rails 应用程序中使用 COPY FROM
【发布时间】:2013-01-25 16:50:06
【问题描述】:

我想让用户选择在我的 Ruby on Rails 3.2 应用程序中上传文件,并将数据放入数据库。我想使用 COPY FROM 命令,因为它比插入 ruby​​ 对象更快。

如果我这样做了

User.connection.execute("COPY users (name, taxon_id, created_at, updated_at) FROM 'a.txt'")

我明白了

ActiveRecord::StatementInvalid: PG::Error: ERROR:  must be superuser to COPY to or from a file
HINT:  Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

但是,\copy 在数据库连接中也不起作用。如何在 Heroku 上使用 PostgreSQL 从 Rails 中的平面文件轻松上传数据?你能获得超级用户权限吗?

【问题讨论】:

标签: ruby-on-rails postgresql heroku


【解决方案1】:

感谢@PhilipHallstrom 的链接,我像这样使用COPY FROM STDIN

rc = User.connection.raw_connection
rc.exec("COPY users (name, taxon_id, updated_at, created_at) FROM STDIN")
begin
  until rc.put_copy_data( data )
    $stderr.puts "  waiting for connection to be writable..."
    sleep 0.1
  end
rescue Errno => err
  @errmsg = @errmsg + "%s while reading copy data: %s" % [ err.class.name, err.message ]
  error = true
else
  rc.put_copy_end
  while res = rc.get_result
    if (res.result_status != 1)
      error = true
      @errmsg = @errmsg + "Result of COPY is: %s" % [ res.res_status(res.result_status) ]
    end
  end
end

【讨论】:

  • 我不明白。 “数据”从何而来?它必须是什么格式?它是一个数组吗?细绳?读取数据的地方是否存在循环?
  • 从这里更好地了解数据变量的来源:kadrmasconcepts.com/blog/2013/12/15/…
【解决方案2】:

您可以使用宝石https://github.com/diogob/postgres-copy 假设data是一个IO对象。

User.copy_from data, columns: [:name, :taxon_id, :updated_at, :created_at]

或者直接使用上传文件的路径:

User.copy_from "/tmp/uploaded_file.csv", columns: [:name, :taxon_id, :updated_at, :created_at]

【讨论】:

    猜你喜欢
    • 2015-03-04
    • 2013-01-08
    • 1970-01-01
    • 2012-06-22
    • 2012-09-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    相关资源
    最近更新 更多