Estou fazendo uma atualização em um site e ela está falhando com PG::NotNullViolation: ERROR: a coluna "private_message" contém valores nulos. Não consigo encontrar onde a coluna private_message existe. Não há plugins não oficiais.
Ah, espere. Aqui está isso:
(Para ver o rastreamento completo, execute a tarefa com --trace)
I, [2020-08-18T18:19:13.253667 #1] INFO -- : == 20200818084329 UpdatePrivateMessageOnPostSearchData: migrando =============
-- execute("DELETE FROM post_search_data\nWHERE post_id IN (\n SELECT posts.id\n FROM posts\n LEFT JOIN topics ON topics.id = posts.topic_id\n WHERE topics.id IS NULL\n)\n")
-> 21.9072s
-- execute("DELETE FROM post_search_data\nWHERE post_id IN (\n SELECT post_search_data.post_id\n FROM post_search_data\n LEFT JOIN posts ON posts.id = post_search_data.post_id\n WHERE posts.id IS NULL\n)\n")
-> 47.2663s
-- execute("UPDATE post_search_data\nSET private_message = true\nFROM posts\nINNER JOIN topics ON topics.id = posts.topic_id AND topics.archetype = 'private_message'\nWHERE posts.id = post_search_data.post_id\n")
-> 107.2137s
-- execute("UPDATE post_search_data\nSET private_message = false\nFROM posts\nINNER JOIN topics ON topics.id = posts.topic_id AND topics.archetype <> 'private_message'\nWHERE posts.id = post_search_data.post_id\n")
-> 834.3738s
-- change_column_null(:post_search_data, :private_message, false)
Hmm, isso é estranho… você pode executar as seguintes consultas para mim no console do Rails e me fornecer os resultados?
DB.query_single(<<~SQL)
SELECT COUNT(*) FROM post_search_data
SQL
DB.query_single(<<~SQL)
SELECT COUNT(*)
FROM post_search_data
LEFT JOIN posts ON posts.id = post_search_data.post_id
LEFT JOIN topics ON topics.id = posts.topic_id
WHERE topics.id IS NULL
SQL
DB.query_single(<<~SQL)
SELECT COUNT(*)
FROM post_search_data
LEFT JOIN posts ON posts.id = post_search_data.post_id
WHERE posts.id IS NULL
SQL
DB.query_single(<<~SQL)
SELECT COUNT(*)
FROM post_search_data
INNER JOIN posts ON posts.id = post_search_data.post_id
INNER JOIN topics ON topics.id = posts.topic_id
SQL
Desculpe, Alan. Sim, isso foi resolvido. Obrigado pela sua ajuda nisso!
Para qualquer outra pessoa com esse problema, se você fizer um simples ./launcher rebuild app, não deverá ter nenhum problema, exceto que seu site pode ficar fora do ar por um longo tempo enquanto a parte de bootstrap da rebuild migra o banco de dados. Essa é a opção segura e fácil, e a menos que você tenha uma instalação de 2 containers, é o que você fará de qualquer maneira.
Eu não queria ter o site fora do ar durante todo o bootstrap. Para este fórum grande (5 milhões de posts e ~50 mil visualizações de página/dia?), minha solução (que descobri apenas com a ajuda do Alan) foi fazer o bootstrap com as migrações pós-atualização desativadas (as migrações levaram praticamente nenhum tempo), iniciar o novo container e fazer as migrações pós-atualização (as migrações levaram de 20 a 40 minutos — eu não estava realmente prestando atenção ao relógio).
Se mais alguém se importar, desde então aprendi que fazer a atualização com docker_manager fará isso de forma muito mais suave, então é isso que eu recomendaria se mais alguém tiver um fórum grande e problemas com o bootstrap.