مرحباً، هذا الموضوع يقدم بعض الخلفية حول الترحيل الذي أخطط له وأختبره ببطء. لقد جربت أخيرًا مستورد Drupal يوم الجمعة الماضي على بيئة اختبار VPS باستخدام مزيج من هذا و هذا. لا يزال المستورد قيد التشغيل أثناء كتابة هذا، لذلك لم أتمكن من اختبار وظائف موقع الاختبار فعليًا بعد، ولكنه على وشك الانتهاء قريبًا.
أكبر مشكلة أواجهها هي “قيمة مفتاح مكررة” في 8 عقد عشوائية على ما يبدو (ما يعادل المواضيع في Discourse) من حوالي 80,000 عقدة إجمالاً. هذه هي أرقام nid المحددة في حال كان هناك خطأ رياضي غريب جدًا يشبه Y2K:
42081, 53125, 57807, 63932, 66756, 76561, 78250, 82707
يحدث نفس الخطأ دائمًا في نفس nid عند إعادة تشغيل المستورد:
Traceback (most recent call last):
19: from script/import_scripts/drupal.rb:537:in `<main>'
18: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
17: from script/import_scripts/drupal.rb:39:in `execute'
16: from script/import_scripts/drupal.rb:169:in `import_forum_topics'
15: from /var/www/discourse/script/import_scripts/base.rb:916:in `batches'
14: from /var/www/discourse/script/import_scripts/base.rb:916:in `loop'
13: from /var/www/discourse/script/import_scripts/base.rb:917:in `block in batches'
12: from script/import_scripts/drupal.rb:195:in `block in import_forum_topics'
11: from /var/www/discourse/script/import_scripts/base.rb:224:in `all_records_exist?'
10: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/transactions.rb:209:in `transaction'
9: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
8: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
7: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
6: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
5: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
4: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
3: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
2: from /var/www/discourse/script/import_scripts/base.rb:231:in `block in all_records_exist?'
1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:56:in `exec'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:56:in `exec': ERROR: duplicate key value violates unique constraint "import_ids_pkey" (PG::UniqueViolation)
DETAIL: Key (val)=(nid:42081) already exists.
20: from script/import_scripts/drupal.rb:537:in `<main>'
19: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
18: from script/import_scripts/drupal.rb:39:in `execute'
17: from script/import_scripts/drupal.rb:169:in `import_forum_topics'
16: from /var/www/discourse/script/import_scripts/base.rb:916:in `batches'
15: from /var/www/discourse/script/import_scripts/base.rb:916:in `loop'
14: from /var/www/discourse/script/import_scripts/base.rb:917:in `block in batches'
13: from script/import_scripts/drupal.rb:195:in `block in import_forum_topics'
12: from /var/www/discourse/script/import_scripts/base.rb:224:in `all_records_exist?'
11: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/transactions.rb:209:in `transaction'
10: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
9: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
8: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
7: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
6: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
5: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
4: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.3.1/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
3: from /var/www/discourse/script/import_scripts/base.rb:243:in `block in all_records_exist?'
2: from /var/www/discourse/script/import_scripts/base.rb:243:in `ensure in block in all_records_exist?'
1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:56:in `exec'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:56:in `exec': ERROR: current transaction is aborted, commands ignored until end of transaction block (PG::InFailedSqlTransaction)
الطريقة الوحيدة التي تمكنت بها من جعله يستمر كانت عن طريق تعديل شروط SQL:
...
LEFT JOIN node_counter nc ON nc.nid = n.nid
WHERE n.type = 'forum'
AND n.status = 1
AND n.nid != 42081
AND n.nid != 53125
AND n.nid != 57807
AND n.nid != 63932
AND n.nid != 66756
AND n.nid != 76561
AND n.nid != 78250
AND n.nid != 82707
LIMIT #{BATCH_SIZE}
OFFSET #{offset};
...
لقد فحصت العقدة الفاشلة الأولى وكذلك العقد nid السابقة والتالية على جانبيها في قاعدة بيانات Drupal المصدر، ولا أرى أي شيء خاطئ. تم تعيين nid كمفتاح أساسي وهو يحتوي على AUTO_INCREMENT، والموقع الأصلي لـ Drupal يعمل بشكل جيد، لذلك لا يمكن أن يكون هناك أي مشكلة أساسية في سلامة قاعدة البيانات المصدر.
بصرف النظر عن الخطأ أعلاه، هذه هي القيود التي أواجهها مع البرنامج النصي:
-
الروابط الدائمة: يبدو أن برنامج استيراد الروابط سيقوم بإنشاء روابط دائمة لعناوين URL للعقد السابقة
example.com/node/XXXXXXX. ولكني أحتاج أيضًا إلى الاحتفاظ بروابط لتعليقات معينة داخل تلك العقد، والتي لها تنسيق:example.com/comment/YYYYYYY#comment-YYYYYYY(YYYYYYYهو نفسه في كلا الحالتين). مخطط عناوين URL الخاص بـ Drupal لا يتضمن معرف العقدة التي يرتبط بها التعليق، بينما يتضمن Discourse ذلك (example.com/t/topic-keywords/XXXXXXX/YY)، لذلك يبدو هذا تعقيدًا كبيرًا. -
قيود أسماء المستخدمين: يسمح Drupal بمسافات في أسماء المستخدمين. أفهم أن Discourse لا يسمح بذلك، على الأقل لا يسمح للمستخدمين الجدد بإنشائها بهذه الطريقة. هذا المنشور يشير إلى أن برنامج الاستيراد سيقوم تلقائيًا بـ “تحويل” أسماء المستخدمين الإشكالية، ولكنني لا أرى أي رمز لذلك في/import_scripts/drupal.rb. تحديث: في الواقع، يبدو أن Discourse تعامل مع هذا تلقائيًا بالطريقة الصحيحة. -
المستخدمون المحظورون: يبدو أن البرنامج النصي يستورد جميع المستخدمين، بما في ذلك الحسابات المحظورة. قد أتمكن من إضافة شرط بسهولة إلى اختيار SQL
WHERE status = 1لاستيراد الحسابات النشطة فقط، ولكني لست متأكدًا مما إذا كان ذلك سيسبب مشاكل في تسلسل السجلات. قبل كل شيء، أفضل الاحتفاظ بأسماء الحسابات المحظورة سابقًا مع عناوين بريدهم الإلكتروني المحظورة بشكل دائم حتى لا يقوم نفس المستخدمين المشكلة بالتسجيل مرة أخرى على Discourse. -
حقول ملف تعريف المستخدم: هل يعرف أي شخص ما إذا كانت هناك أمثلة رمزية في أحد المستوردات الأخرى لاستيراد حقول المعلومات الشخصية من ملفات تعريف حسابات المستخدمين؟ لدي حقل ملف تعريف واحد فقط (“الموقع”) أحتاج إلى استيراده.
-
الصور الرمزية (ليست Gravatars): يبدو غريبًا بعض الشيء أن هناك رمزًا في مستورد Drupal لاستيراد Gravatars ولكن ليس للصور الرمزية المحلية الأكثر استخدامًا.
-
الرسائل الخاصة: ستستخدم جميع منتديات Drupal 7 تقريبًا وحدة privatemsg الخارجية (لا توجد وظيفة PM رسمية في Drupal). لا يدعم المستورد استيراد الرسائل الخاصة. في حالتي، أحتاج إلى استيراد حوالي 1.5 مليون منها.
شكرًا مقدمًا على مساعدتك وعلى توفير برنامج استيراد Drupal النصي.




