"ActionView:: Template:: Error (Неизвестный первичный ключ для таблицы" после попытки перетащить локальную базу данных в Heroku

Для приложения Ruby-on-Rails, которое я размещаю через Heroku, я недавно загрузил резервную копию, восстановил ее локально, а затем добавил данные в базу данных из внешних источников. Все это прекрасно работало.

После того, как обновленная база данных была перенесена в Heroku с помощью heroku pg:push <localdbname> HEROKU_DATABASE_URL --app <appname>, приложение работало нормально, и я мог видеть недавно добавленные данные.

Однако сегодня, когда я пытался войти в приложение на Heroku, я получал сообщения об ошибках. В моем файле журнала я увидел эту ошибку:

ActionView::Template::Error (Unknown primary key for table ...

В соответствии с этим сообщением SO: Получение и неизвестный первичный ключ для таблицы " в то время как идентификатор есть

один пользователь смог обойти эту проблему, сбросив и нажав базу данных на Heroku несколько раз. Однако это не сработало для меня. Я попытался reset и вытащил базу данных как минимум 4 раза.

Одна из возможностей заключается в том, что моя база данных postgres использует версию 9.6, а приложение использует версию 9.4. База данных Heroku - это база данных Hobby-Basic. Существует документация от Heroku о том, как обновить версию Postgres, но не совсем ясно из их примера, что мне нужно будет сделать. Я предполагаю, что мне в основном нужно создать новую базу данных, скопировать данные из старого в новое, а затем уничтожить старое. Кто-нибудь делал это раньше? Есть ли плата, связанная с этим? И обновил версию Postgres удаленно исправил эту проблему для других людей?

Ответ 1

Раньше я сталкивался с подобными проблемами. Я создал базу данных postgres за пределами рельсов в RazorSQL. Я импортировал данные из внешних источников, и когда я запускал их локально, все работало нормально. Когда дело дошло до развертывания, я столкнулся со всеми проблемами.

  • Я создал таблицы за пределами рельсов, поэтому никаких миграций не было создано. Мне пришлось воссоздать таблицы, удалив текущую модель и создав новую модель, которая является копией старой, только на этот раз, когда создается миграция:

    rails генерировать имя модели объявления: строка описание: цена текста: десятичная seller_id: integer email: string img_url: string

  • Мне нужно было импортировать данные из базы данных, которую я уже создал, и до того, как я сделал что-то, что я на самом деле создал семенной файл, используя этот камень https://github.com/rroblak/seed_dump. Все, что мне нужно было сделать, когда я снова создал модель (не забудьте удалить модель и воссоздать ее), был запущен rake db:seed, и он потянул данные.

3. Последнее, что мне нужно было сделать, - вставить ассоциации в модели, например, в модель владельца, помещая has many: customers для подключения модели клиента.

Другой сценарий заключался в том, что я выполнил запрос в RazorSQL и сгенерировал новую таблицу из запроса и импортировал ее в postgres. Проблема в том, что это была только таблица из результатов, поэтому у нее не было первичного ключа. Мне пришлось вручную создать это в postgres с помощью ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;. Это дало мне поле с добавлением первичного ключа с автоматическим добавлением, и я должен отдать должное этому ответу, который помог мне fooobar.com/questions/62536/.....

Надеюсь, что это поможет.

Ответ 2

В соответствии с документами вы можете выбрать как обновить базу данных. pg:copy и pg:upgrade.

В вашем случае я рекомендую pg:copy: это проще, но вам нужно, чтобы ваша база данных была "выключена" во время обновления. Это не должно быть проблемой, поскольку ваша база данных в настоящее время не работает.

pg:upgrade следует использовать только тогда, когда требуется время простоя для копии PG обновление недопустимо долго для вашего бизнеса.

Обновление с копией PG: (Все шаги подробно объясняются в ссылке)

  • Предоставление новой базы данных

Вам нужно создать новую базу данных, она будет автоматически использовать последнюю версию postgresql для heroku (в вашем случае 9.6)

heroku addons:create heroku-postgresql:standard-0
  • Предотвращение новых обновлений базы данных

Остановите текущую базу данных из режима записи, чтобы избежать поврежденных данных при копировании на новый

heroku maintenance:on
  • Перенос данных в новую базу данных

Вам нужно скопировать все данные из старой БД в новую.

heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_PINK --app sushi
  • Содействовать новой базе данных

Вам нужно уведомить герою, что вы будете использовать новую БД, а не старую.

heroku pg:promote HEROKU_POSTGRESQL_PINK
  • Последний шаг: активировать приложение

Теперь все должно быть хорошо, просто активируйте свою базу данных, чтобы сохранить новый запрос.

heroku maintenance:off

Как вы можете видеть, все шаги просты. Поэтому, если вы обновляете версию postgreSQL, это не решит проблему, но вы можете вернуться к старой, прежде чем удалять ее.

Цены

Я думаю, что это зависит от вашей подписки (Хобби, Стандарт или Премиум) https://www.heroku.com/pricing. Это может быть бесплатно или дешево, но я думаю, что это также зависит от размера вашей БД.

Чтобы быть уверенным, что это не будет стоить вам слишком много, я уверен, что вы можете напрямую обратиться к поддержке Heroku https://devcenter.heroku.com/articles/paid-support.