3

Ruby on Rails 3.2 アプリケーションでファイルをアップロードするオプションをユーザーに提供したいと考えています。データは db に入ります。COPY FROMruby オブジェクトを挿入するよりも高速なので、このコマンドを使用したかったのです。

私が行った場合

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.

ただし、\copydb 接続でも機能しません。Heroku で PostgreSQL を使用して Rails のフラット ファイルからデータを簡単にアップロードするにはどうすればよいですか? スーパーユーザー権限を取得できますか?

4

2 に答える 2

4

@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
于 2013-01-25T20:27:44.193 に答える
1

gem を使用できますhttps://github.com/diogob/postgres-copydataは 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]
于 2014-06-18T02:17:58.567 に答える