"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.