ruby-on-rails - 在带有 Postgresql 后端的 Heroku 上的 Rails 应用程序中使用 COPY FROM

标签 ruby-on-rails postgresql heroku

我想为用户提供在我的 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 中的平面文件上传数据?你能获得 super 用户权限吗?

最佳答案

感谢@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

关于ruby-on-rails - 在带有 Postgresql 后端的 Heroku 上的 Rails 应用程序中使用 COPY FROM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14526489/

相关文章:

postgresql - 在 Redshift 中创建 View 时有什么方法可以强制后期绑定(bind)吗?

postgresql - Elixir Ecto 查询抛出 `Protocol not implemented Error`

ruby-on-rails - 每次推送到 heroku 时都需要重置数据库吗?

ruby-on-rails - 如何使用基于多模式的应用程序 Rails 设置延迟作业。?

ruby-on-rails - 如何使用 bundle exec rake test 在 Windows gitbash 中获取颜色

sql - 左连接 - 使用 where (null <> 'p') 时的行为

node.js - 在子目录中将 Gulp 应用程序部署到 Heroku

git - 从 Heroku 应用程序中删除文件

sql - 按关联字段排序的 Rails

ruby-on-rails - 关于rails框架代码的问题