8

Ho un'app per rails 3.1 che memorizza le immagini in un campo binario in un database postgresql (sono a conoscenza di potenziali problemi con l'archiviazione di immagini in un database, ma devo farlo per adesso). Tutto funziona a livello locale in modalità sviluppo e specifiche su OSX, ma tutte le immagini sono rotte nell'app distribuita su Heroku. Ho verificato che i dati nel database siano corretti puntando il mio computer locale nello stesso database utilizzato dall'istanza di heroku e tutte le immagini visualizzate correttamente.ActiveRecord carica erroneamente il campo binario su Heroku, su OSX

Quindi, il problema sembra essere in ActiveRecord (in esecuzione su Heroku) che carica i dati dal database. Immagino anche che sia un problema di codifica. Eseguendo localmente la console di rails posso verificare che i byte di questi campi siano corretti, ma l'esecuzione della console di rails su Heroku mostra un byte errato. Infatti, il caricamento di un file N byte tramite ActiveRecord su Heroku risulta in un byte di 2N + 1 per tutti i file.

Qualsiasi aiuto è molto apprezzato.

+0

Qual è il tipo di colonna? –

+0

: binario in binari, bytea in postgres. –

risposta

16

L'odore 2n + 1 come se steste ottenendo l'output esadecimale dal tuo bytea invece del vecchio formato di escape. Sto indovinando che si sta utilizzando un database dedicato e questo significa che PostgreSQL 9.0 che ha un different default encoding for bytea:

Durante la migrazione da PostgeSQL 8.x a PostgreSQL 9.x è possibile incorrere in problemi di compatibilità stringa binaria. La rappresentazione predefinita è esadecimale nella versione 9 ma la versione 8 è impostata su escape. È possibile impostare l'escape di PostgreSQL 9 impostando manualmente bytea_output.

se ho ragione, allora è possibile utilizzare le istruzioni nel link qui sopra o utilizzare questa versione riassunta:

  1. Nel tipo di riga di comando "Heroku config vars" per ottenere i dati di sistema .
  2. Estrai il nome utente PostgreSQL dal tuo DATABASE_URL che assomiglia a postgres://username:[email protected]/database_name.
  3. Utilizzare heroku pg:psql per ottenere una console PostgreSQL.
  4. Execute ALTER ROLE username SET bytea_output TO 'escape'; dalla console psql dove, ovviamente, username è il nome utente da (1).
  5. Uscita psql fare un heroku restart per riavviare l'applicazione.

Quindi riprovare e si spera che si ottengano i byte corretti.

+0

Grazie! In realtà ho letto quel documento, ma ho pensato che non fosse il mio problema dal momento che puntare il mio server di dev rail locale nello stesso database (e usando lo stesso utente del database) ha prodotto immagini funzionanti. Suppongo che non lo faccio ancora al 100%, ma ha funzionato. –

+0

Risposta geniale, grazie! Questo ha risolto il mio problema molto simile: http://stackoverflow.com/questions/12084414/binary-data-getting-borked-when-saving-to-postgresql – devth

+2

FYI, noi di Heroku Postgres abbiamo reso questo il default per tutti i nuovi starter database di livelli ('SET bytea_output TO 'escape''). Puoi verificarlo eseguendo 'select setting da pg_settings where name =' bytea_output '; ' – hgmnz