ActiveRecord lädt das Binärfeld fälschlicherweise auf Heroku, gut auf OSX

8

Ich habe eine Rails 3.1-App, die Bilder in einem binären Feld in einer postgresql-Datenbank speichert (Ich kenne mögliche Probleme beim Speichern von Bildern in einer Datenbank, muss dies aber jetzt tun). Alles funktioniert gut im Entwicklungsmodus und unter OSX, aber alle Bilder sind in der App, die für Heroku bereitgestellt wird, defekt. Ich habe überprüft, dass die Daten in der Datenbank korrekt sind, indem ich meinen lokalen Computer auf die gleiche Datenbank wie die Heroku-Instanz zeige und alle Bilder korrekt angezeigt habe.

Das Problem scheint also in ActiveRecord (läuft auf Heroku) zu liegen und lädt die Daten aus der Datenbank. Ich vermute auch, dass es sich um ein Codierungsproblem handelt. Wenn ich die Rails-Konsole lokal laufe, kann ich überprüfen, dass die Bytesize dieser Felder korrekt ist, aber das Ausführen der Rails-Konsole auf Heroku zeigt eine falsche Bytesize. Tatsächlich führt das Laden einer N-Byte-Datei über ActiveRecord auf Heroku zu einer Bytegröße von 2N + 1 für alle Dateien.

Jede Hilfe wird sehr geschätzt.

    
Andy Morris 16.12.2011, 19:30
quelle

1 Antwort

16

Die 2n + 1 riecht so, als würden Sie hexadezimale Ausgaben von Ihrem bytea anstelle des alten Escape-Formats erhalten. Ich vermute, dass Sie eine dedizierte Datenbank verwenden, und das bedeutet PostgreSQL 9.0, die eine andere Standardcodierung für bytea :

  

Wenn Sie von PostgeSQL 8.x zu PostgreSQL 9.x migrieren, können Probleme mit der Kompatibilität von Binärzeichenfolgen auftreten. Die Standarddarstellung ist in Version 9 hexadezimal, aber Version 8 ist auf Escape festgelegt. Sie können PostgreSQL 9 mit Escapezeichen versehen lassen, indem Sie bytea_output manuell setzen.

Wenn ich Recht habe, können Sie die Anweisungen im obigen Link verwenden oder diese zusammengefasste Version verwenden:

  1. Geben Sie in der Befehlszeile " heroku config vars " ein, um Ihre Systemdetails abzurufen.
  2. Extrahiere den PostgreSQL-Benutzernamen aus deinem DATABASE_URL , der wie postgres://username:password@host/database_name aussieht.
  3. Verwenden Sie heroku pg:psql , um eine PostgreSQL-Konsole zu erhalten.
  4. Führe ALTER ROLE username SET bytea_output TO 'escape'; von der Konsole psql aus, wobei username natürlich der Benutzername aus (1) ist.
  5. Beenden Sie psql machen Sie heroku restart , um Ihre Anwendung neu zu starten.

Versuchen Sie es erneut und hoffentlich erhalten Sie die richtigen Bytes.

    
mu is too short 16.12.2011, 23:17
quelle