2016-07-15 9 views
0

Ich werde meine Anwendung auf Heroku bereitstellen, für diesen Zweck habe ich dort eine Datenbank erstellt. Da die Hibernate-Option hibernate.hbm2ddl.auto=create nicht funktionierte, schrieb ich eine SQL-Abfrage manuell. Alles lief gut, bis ich versuchte, ein BLOB in die Datenbank einzufügen.Heroku PostgreSQL BLOB Einfügung schlägt fehl

Ich habe eine Tabelle photo:

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

und ich mache solche Einfügung query:

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

Nach diesem Schritt bekomme ich einen Fehler:

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

Einfügen von andere Entitäten schlagen auch fehl, da sie einen Fremdschlüssel zu photo Tabelle haben.

Was ist dieser Fehler über, ist es möglich, BLOBs in Heroku-Datenbank einfügen nicht ein Superuser?

Antwort

1

Der serverseitige Dateizugriff ist Super-User-Only, da er mit den Dateiberechtigungen des Servers ausgeführt wird. Wenn Sie eine Datei lesen können, könnten Sie beispielsweise Datenbankdateien lesen und speichern. Und Sie könnten Daten durch Schreibvorgänge zerstören.

Die Dateizugriffsfunktionen auf dem Server sind daher relativ begrenzt auf administrative Aktionen. Für Ihre Anwendung möchten Sie etwas anderes machen. Verwenden Sie für Bytea die clientseitigen Bibliotheken, die Sie für das Escaping verwenden möchten. Dies hängt von der Sprache ab (in Perl, PHP, Java usw.).

Eine Sache zu beachten ist, dass das Entkommen und Unescaping von Bytea-Feldern ziemlich viel RAM braucht, so kann es 8 oder mehr mal den RAM als die Datei groß nehmen. Das ist nur eine Sache, über die man nachdenken sollte.

+0

Meinen Sie, ich muss Byte-Array in einen String konvertieren? Ich benutze Java. Ist es also unmöglich, 'BYTEA' in der Datenbank von Heroku zu speichern? – DimaSan

+0

Siehe die jdbc docs ;-) https://jdbc.postgresql.org/documentation/80/binary-data.html –

+0

Jeder Treiber, mit dem ich je gearbeitet habe, verfügt über die Möglichkeit, die Konvertierung für Sie durchzuführen. JDBC ist nicht anders. –