2016-07-15 6 views
0

私はHerokuにアプリケーションをデプロイします。この目的のためにそこにデータベースを作成しました。 Hibernateのオプションhibernate.hbm2ddl.auto=createが機能しなかったので、私は手動でSQLクエリを書きました。 BLOBをデータベースに挿入しようとするまで、すべてがうまくいった。Heroku PostgreSQLのBLOBの挿入に失敗しました

私はテーブルphoto持っている:

CREATE TABLE photo (
    id  SERIAL PRIMARY KEY, 
    content BYTEA 
); 

を、私はこのような挿入クエリをやってる:

INSERT INTO photo (content) VALUES (pg_read_file('./files/images/01_Tomato-Soup.jpg')::BYTEA); 

このステップの後、私はエラーを取得する:の

[2016-07-15 18:57:01] [42501] ERROR: must be superuser to read files 

の挿入をphotoテーブルへの外部キーを持っているので、他のエンティティも失敗します。

このエラーは何ですか?HerokuデータベースにBLOBをスーパーユーザーではなく挿入することは可能ですか?

答えて

1

サーバー側のファイルアクセスは、サーバーのファイルアクセス許可で実行されるため、スーパーユーザーのみです。ファイルを読み取ることができれば、たとえばデータベースファイルを読み込んで保存することができます。また、書き込みによってデータを破壊する可能性もあります。

したがって、サーバー上のファイルアクセス機能は、管理操作のようなものに比較的制限されています。あなたのアプリケーションでは、何か違うことをしたいのです。 byteaの場合は、エスケープするクライアントサイドライブラリを使用します。これは言語に依存します(Perl、PHP、Javaなどでは異なります)。

byteaフィールドのエスケープとアンエスケープ処理にはかなりのRAMが必要なため、ファイルサイズがRAMより8倍以上大きくなることがあります。だからこそ、考えなければならないことが1つだけです。

+0

バイト配列を文字列に変換する必要があるのですか?私はJavaを使用します。 HerokuのデータベースにBYTEAを格納することは不可能ですか? – DimaSan

+0

jdbc docs ;-)を参照してください。https://jdbc.postgresql.org/documentation/80/binary-data.html –

+0

私がこれまでに働いたことがあるすべてのドライバには、変換を行うための機能があります。 JDBCも変わりません。 –

関連する問題