2015-01-26 4 views
5

Это задано несколько раз (here и here и т. Д.).Rails on heroku: after push, get «PG :: UniqueViolation: ERROR: дублирующее значение ключа нарушает уникальное ограничение»

Каждый раз, когда я нажимаю мои рельсы приложение к Heroku (по крайней мере, за последние несколько месяцев, я бы сказал), я должен сбросить свои ключи, используя знакомые

ActiveRecord::Base.connection.tables.each { |t| ActiveRecord::Base.connection.reset_pk_sequence!(t) } 

колдовство. В противном случае я получаю PostGreSQL неудачи, как это, когда я пытаюсь создать новые записи:

(Это пример, это происходит на различных таблицах, в зависимости от того, что первые действия в том, что делается на приложение после толчка.)

Как только я делаю заклинание сброса ключей, это нормально до моего следующего нажатия на герою ... даже когда мой push не включает никаких миграций.

Я немного озадачен тем, почему это происходит и что можно сделать, чтобы предотвратить его.

Нет, в моих задачах развертывания нет кода обработки данных.

+0

Интересно, имеет ли он какое-то отношение к тому факту, что это таблица соединений HABTM? – Beartech

+0

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

+0

Единственное, что я могу придумать, чтобы помочь диагностировать, - это следить за журналами Heroku в то же самое время, когда вы нажимаете обновление до тех пор, пока не получите ошибку. Делайте 'heroku logs -tail' в другом окне перед нажатием и смотрите его вживую. Сравните это с журналом в локальной локальной среде. – Beartech

ответ

1

Это происходит потому, что первичный ключ (id) уже существует. Зачем? Потому что последовательность первичных ключей в postgres перепутана. не глядя на базу данных или зная схему, сложно предложить решение, но если ваша база данных может обеспечить время простоя 10-15 минут. вы можете попробовать

  1. Если есть только одна таблица, которая является проблемой. вы можете экспортировать все данные в новый набор таблиц с новыми именами без столбца идентификатора.
  2. Отмените существующие таблицы и переименуйте только что созданную таблицу в имена старых таблиц.
  3. включить запись в наше приложение снова.

Но если вся БД в беспорядке, тогда ему нужно что-то более сложное, но я не могу сказать, не глядя на схему.

+0

Ну, я понимаю, что и почему. ActewRecord 'reset_pk_sequence!', О котором я упоминал выше, должен исправить это. То, что я действительно не понимаю (и что я хотел бы предотвратить), - это то, почему это происходит снова при каждом новом нажатии приложения. – denishaskin

+1

можете ли вы разместить образец приложения, которое воспроизводит это? – CuriousMind

+0

@CuriousMind. У меня такая же проблема, как и у ОП. Каждый раз, когда я пробовал его индексы ID на 1, так что да, есть счетчик, который выключен. Но у меня есть 130 элементов и есть таблицы, связанные через ID, поэтому не хочу воссоздавать таблицу. Моя база данных PostgresQL (фактически PostGIS) уже существует и связана с ней в моем новом проекте Rails. Так кто-нибудь знает, где находится счетчик и как его сбросить? Может быть, я могу просто попробовать еще 125 раз и дойти до конца базы данных. – Greg

Смежные вопросы

 Смежные вопросы