Ошибка обновления: UniqueViolation: дублирование значения ключа нарушает уникальное ограничение "data_explorer_queries_pkey"

Сегодняшнее обновление до последней версии не удалось:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' завершилось с ошибкой, код возврата #<Process::Status: pid 3194 exit 1>
Место ошибки: /pups/lib/pups/exec_command.rb:112:in `spawn'
Ошибка выполнения с параметрами {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
590cf0611c566ea6df5f70ffdd2cec2359e84eaea29b7abcde77d56288a46370
** НЕ УДАЛОСЬ ЗАПУСТИТЬ ** пожалуйста, прокрутите вверх и найдите предыдущие сообщения об ошибках, их может быть несколько.

Выше в логе:

Вызвано:
PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "data_explorer_queries_pkey"
DETAIL:  Key (id)=(-10) уже существует.

и

rake aborted!
StandardError: Произошла ошибка, эта и все последующие миграции отменены:

ERROR:  duplicate key value violates unique constraint "data_explorer_queries_pkey"
DETAIL:  Key (id)=(-10) уже существует.

Похоже, мне нужно удалить дубликат ключа data_explorer_queries_pkey.

Как это сделать?

Спасибо, но я не могу войти в приложение:

./launcher enter app
Ответ от демона об ошибке: Контейнер 694b24a2a235e90456fb0ca770c86ac14bb914ad33ada8a18fc4777a1188d848 не запущен
root@gaoa-discourse:/var/discourse#

А также:

root@gaoa-discourse:/var/discourse# su - postgres
Запись пароля для пользователя 'postgres' отсутствует

Значит, нужно перезапустить контейнер?

./launcher start app

Затем выполните команду вроде:

./launcher enter app

а затем:

su postgres -c 'psql discourse'

Спасибо! Не уверен, почему оно не запустилось с первого раза.

Похоже, у меня есть дубликат с id «10»:

4374 | discourse-data-explorer | q:-10 | JSON      | {"id":-10,"name":"Inactive Users with no posts","description":"analyze pre-Discourse signups.","sql":"SELECT\
n    u.id,\n    u.username_lower AS \"username\",\n    u.created_at,\n    u.last_seen_at\nFROM users u\nWHERE u.active = false\nORDER BY u.id\n","created_by":"-1",
"created_at":null,"group_ids":[],"last_run_at":"2019-10-21T04:03:35.548+00:00"}

4114 | discourse-data-explorer | q:-10 | JSON      | {"id":-10,"name":"Inactive Users with no posts","description":"analyze pre-Discourse signups.","sql":"SELECT\
n    u.id,\n    u.username_lower AS \"username\",\n    u.created_at,\n    u.last_seen_at\nFROM users u\nWHERE u.active = false\nORDER BY u.id\n","created_by":"-1",
"created_at":null,"last_run_at":"2019-02-27T06:17:48.317+00:00"}

Так что, полагаю, мне стоит выполнить это:

DELETE from plugin_store_rows WHERE id = 10

или должно быть так:

DELETE from plugin_store_rows WHERE id = -10

Мне интересно — какая запись будет удалена командой выше: первая найденная или обе?

Числа в столбце ID — это 4374 и 4114. Удалите запись с наибольшим номером.

НЕ выполняйте DELETE from plugin_store_rows WHERE id = 10!! Иначе вы удалите не ту запись!

А, вот это?

DELETE from plugin_store_rows WHERE id = 4374;

Да. В выводе запроса PL/SQL вы должны увидеть правильный заголовок столбца, верно?

Теперь, когда вы об этом упомянули, да. Я прокрутил вниз, потому что вывод выглядит так:

Да, и в целом рекомендуется сначала выполнить команды в тестовом режиме, чтобы оценить их влияние, прежде чем применять изменения, см.:

Тогда, если вы обнаружите, что удалили 500 строк вместо одной, у вас будет возможность откатить изменения без риска.

Успех! :tada: Спасибо за подсказку, @merefield.

В моей команде DELETE отсутствовала закрывающая точка с запятой (обновлено выше).

О да, это меня каждый раз подводит :wink: