Así que esta mañana intenté actualizar mi tablero y obtuve un error:
PG::UniqueViolation: ERROR: el valor de clave duplicada viola la restricción de unicidad “index_users_on_username”
Menciona a un usuario llamado “MikeC”. Así que investigué un poco y se me indicó que debería restaurar postgres_data, reiniciar mi tablero y luego revisar la base de datos en busca de duplicados. Ejecuté una consulta rápida para username_lower = ‘mikec’ y encontré 1 fila. Luego encontré esta consulta más elaborada:
SELECT username_lower, count(*) from users GROUP by username_lower HAVING count(*) > 1;
La cual no devolvió ninguna fila. Entonces, ¿dónde está el duplicado? Agradezco cualquier ayuda. Estoy ejecutando sobre los datos antiguos, pero me gustaría poder reconstruir la aplicación correctamente.
Bueno, así es como lo solucioné, aunque estoy seguro de que hay una forma mejor:
Fui a mi sección de administración y busqué ‘MikeC’, lo que devolvió 2 usuarios. Así que renombré el más antiguo y, en lugar de ejecutar rebuild de nuevo, simplemente me conecté a la base de datos y reindexé:
cd /var/discourse
./launcher enter app
sudo -i postgres psql discourse
discourse# REINDEX SCHEMA CONCURRENTLY public;
Eso indicaría otro duplicado y volvería a la interfaz web para buscar a ese usuario y renombrar al usuario más antiguo. Lavar, enjuagar y repetir hasta que no queden duplicados. ¡Luego reconstruir y listo!
Sin embargo, me gustaría saber:
¿Por qué Discourse permite duplicados? El nombre de usuario puede no distinguir mayúsculas y minúsculas, pero username_lower se normaliza a lo que debería ser un valor único. Esto parece un error bastante grave.
¿Cuál es una mejor manera de encontrar y corregir estos duplicados?
No creo que haya una mejor manera. Los nombres de usuario duplicados no están permitidos, pero parece que algún error anterior no aplicaba la verificación de minúsculas. Hubo otro tema sobre esto recientemente.