PG::UniqueViolation: ERROR: duplicate key value violates unique constraint “index_users_on_username”
يُشير الخطأ إلى مستخدم باسم “MikeC”. لذا قمت ببعض البحث وأُخبرت بأن عليّ استعادة postgres_data وإعادة تشغيل لوحتي، ثم فحص قاعدة البيانات بحثًا عن التكرارات. لذا شغلت استعلامًا سريعًا للبحث عن username_lower = ‘mikec’ ووجدت صفًا واحدًا. ثم عثرت على هذا الاستعلام المتقدم:
SELECT username_lower, count(*) from users GROUP by username_lower HAVING count(*) > 1;
والذي لم يُرجع أي صفوف. إذن أين التكرار؟ أي مساعدة مُقدّرة. أنا أعمل على البيانات القديمة، لكنني أود أن أتمكن من إعادة بناء التطبيق بشكل صحيح.
إليك كيف قمت بحل المشكلة، لكنني متأكد من وجود طريقة أفضل:
ذهبت إلى قسم الإدارة الخاص بي وبحثت عن ‘MikeC’، ما أعاد نتيجة مستخدمين اثنين. لذا قمت بإعادة تسمية أقدم المستخدمين، وبدلاً من إعادة تشغيل عملية إعادة البناء مرة أخرى، قمت بتسجيل الدخول إلى قاعدة البيانات وإعادة الفهرسة مباشرةً:
cd /var/discourse
./launcher enter app
sudo -i postgres psql discourse
discourse# REINDEX SCHEMA CONCURRENTLY public;
إذا ظهر مستخدم مكرر آخر، سأعود إلى واجهة الويب وأبحث عن ذلك المستخدم وأعيد تسمية المستخدم الأقدم. كرر العملية (اغسل، اشطف، وكرر) حتى لا يتم العثور على أي مستخدمين مكررين. ثم قم بإعادة البناء وستنجح العملية!
ومع ذلك، أود معرفة ما يلي:
لماذا يسمح discourse بوجود مستخدمين مكررين؟ يمكن أن يكون اسم المستخدم غير حساس لحالة الأحرف، لكن username_lower يُطبع إلى قيمة يجب أن تكون فريدة. يبدو هذا وكأنه خطأ كبير.
ما هي الطريقة الأفضل للعثور على هؤلاء المستخدمين المكررين وإصلاحهم؟
لا أعتقد أن هناك طريقة أفضل. أسماء المستخدمين المكررة غير مسموح بها، لكن يبدو أن خطأً سابقًا لم يفرض فحص التحويل إلى أحرف صغيرة. كان هناك موضوع آخر حول هذا الأمر مؤخرًا.