8

Mam aplikację Rails 3.1, która przechowuje obrazy w binarnym polu w bazie danych PostgreSQL (mam świadomość potencjalnych problemów z przechowywaniem obrazów w bazie danych, ale muszę to zrobić Na razie). Wszystko działa dobrze lokalnie w trybie programowania i specyfikacje na OSX, ale wszystkie obrazy są uszkodzone w aplikacji wdrożonej na Heroku. Sprawdziłem, czy dane w bazie danych są poprawne, wskazując lokalny komputer na tę samą bazę danych, której używa instancja Heroku, i wszystkie obrazy są wyświetlane poprawnie.ActiveRecord ładuje nieprawidłowo pole binarne na Heroku, dobrze na OSX

Problem leży więc w ActiveRecord (uruchamianie na Heroku) ładowanie danych z bazy danych. Zgaduję również, że jest to problem z kodowaniem. Uruchamiając lokalnie konsole szyn, mogę sprawdzić, czy bajty tych pól są poprawne, ale uruchomienie konsoli szyn na Heroku pokazuje niepoprawny bajt. W rzeczywistości ładowanie pliku N-bajtowego za pomocą ActiveRecord na Heroku daje bajt 2N + 1 dla wszystkich plików.

Każda pomoc jest bardzo doceniana.

+0

Jaki jest typ kolumny? –

+0

: plik binarny w szynach, bytea w postgresie. –

Odpowiedz

16

2n + 1 pachnie, jakbyś otrzymywał wyjście szesnastkowe ze swojego bytea zamiast starego formatu z ucieczką. Zgaduję, że używasz dedykowanego bazy a to oznacza, PostgreSQL 9.0, który ma different default encoding for bytea:

podczas migracji z PostgeSQL 8.x do PostgreSQL 9.x może napotkasz problemy z binarnej kompatybilności strun. Domyślna reprezentacja to hex w wersji 9, ale w wersji 8 jest ustawiona na escaped. Możesz użyć Escape PostgreSQL 9, ręcznie ustawiając bytea_output.

Jeśli mam rację, to możesz skorzystać z instrukcji w link powyżej lub skorzystać z tej Wersja skrócona:

  1. W typie wiersza poleceń „Heroku config vars”, aby uzyskać szczegółowe informacje systemowe .
  2. Wyodrębnij nazwę użytkownika PostgreSQL z numeru DATABASE_URL, która wygląda jak postgres://username:[email protected]/database_name.
  3. Użyj heroku pg:psql, aby uzyskać konsolę PostgreSQL.
  4. Wykonaj ALTER ROLE username SET bytea_output TO 'escape'; z konsoli psql, gdzie oczywiście username jest nazwą użytkownika z (1).
  5. Zakończ psql wykonaj heroku restart, aby ponownie uruchomić aplikację.

Następnie spróbuj ponownie i miejmy nadzieję, że otrzymasz właściwe bajty.

+0

Dziękujemy! Tak naprawdę czytałem ten dokument, ale myślałem, że to nie jest mój problem, ponieważ wskazanie mojego lokalnego serwera rails dev w tej samej bazie danych (i użycie tego samego użytkownika bazy danych) spowodowało, że obrazy działają. Domyślam się, że nadal nie gram w 100%, ale to wystarczyło. –

+0

Geniusz odpowiedź, dzięki! To rozwiązało mój bardzo podobny problem: http://stackoverflow.com/questions/12084414/binary-data-getting-borked-when-saving-to-postgresql – devth

+2

FYI, my w Heroku Postgres zrobiliśmy to domyślnie dla wszystkich nowych rozruszników warstwy bazowe ('SET bytea_output TO 'escape''). Możesz to sprawdzić, uruchamiając 'select setting from pg_settings gdzie name = 'bytea_output';' – hgmnz