هجرة كبيرة لمنتديات Drupal، أخطاء وقيود المستورد

أوه… لم أفكر قط في تشغيل المستورد أكثر من مرة على بيانات الإنتاج. شكراً جزيلاً على هذه الفكرة.

إذن، بشكل أساسي، سأقوم بعمل نسخة احتياطية من قاعدة بيانات Drupal الإنتاجية وتشغيل استيراد كامل للمدة التي يستغرقها ذلك مع ترك منتدى Drupal مفتوحًا للجمهور، ثم سأضع منتدى Drupal في وضع عدم الاتصال وأقوم بعمل نسخة احتياطية أخرى لقاعدة البيانات وتحميلها في مثيل MySQL للمستورد وإعادة تشغيل البرنامج النصي للمستورد؟

العيب الوحيد الذي يمكنني رؤيته هناك هو أن أي تعديلات على منشورات Drupal أو عمليات حذف للمنشورات أو تغييرات في ملفات تعريف المستخدمين الحالية خلال تلك الفترة (لنسميها 3 أيام) من الاستيراد الأولي حتى الاستيراد الثاني لن يتم استيرادها، فقط المستخدمون والمنشورات الجديدة تمامًا خلال تلك الفترة، صحيح؟

هذا صحيح. سيتم فقدان البيانات التي تم تعديلها. البديل هو إيقاف المنتدى عن العمل لتلك الفترة. يمكنك تحذير الناس. في الواقع، لم يشتكِ أحد.

إعجاب واحد (1)

رائع، يبدو هذا حلاً وسطًا معقولًا جدًا لتقليل وقت التوقف عن العمل. شكرًا مرة أخرى على هذه الفكرة.

إعجاب واحد (1)

بعد الالتزام النهائي بعملية الاستيراد الإنتاجية مباشرة، كنت أتحقق بشكل عشوائي من بعض سلاسل المنتديات المستوردة عندما اكتشفت مشكلة كبيرة. كما كان الموضوع المتكرر هنا، فإنها ليست حقًا خطأ Discourse أو برنامج الاستيراد. ولكن اتضح أنه عندما يتم تعديل رد موضوع (“تعليق” في مصطلح Drupal) فإنه أحيانًا يغير الطابع الزمني created. على حد علمي، يجب أن يغير الطابع الزمني changed بدلاً من ذلك. ولكن على الرغم من هذه المشكلة في Drupal، إلا أنها لا تزال تحافظ على ترتيب التعليقات. ولكن الطريقة التي يعمل بها برنامج استيراد Drupal لـ Discourse، فإنه يقوم بفرز الردود حسب الطابع الزمني created الخاص بها (على الرغم من أنني لا أرى أي عبارات ORDER في برنامج drupal.rb). من اختباري في phpMyAdmin على قاعدة بيانات Drupal، يبدو أنه يحتاج ببساطة إلى ORDER BY c.cid ASC للحفاظ على ترتيب الترابط الصحيح عبر معرف التعليق الأصلي في Drupal cid الذي هو متسلسل ولا يتغير أبدًا. لكنني لست متأكدًا مما إذا كان مستورد Discourse سيسمح للردود المتسلسلة بأن تكون تواريخها خارج الترتيب، و/أو ما إذا كان سيقوم بفرزها بنفسه حسب تاريخ النشر؟ أود الحصول على رأي المنشئ الأصلي لمستورد drupal.rb (وأي شخص آخر بالطبع)، هل سينجح هذا وهل ستكون هناك أي عواقب غير مقصودة؟

أعتقد (ولكن لا أعرف حقًا، قاعدة بيانات دروبال لا معنى لها بالنسبة لي) أنه يمكنك تعديل الاستعلام لسحب وقت الإنشاء من المنشور الأصلي وليس المنشور المعدل.

أعتقد أن هناك جدولًا يحتوي على المنشور/الوقت الأصلي وجدولًا آخر يحتوي على التعديلات.

أعتقد أن الترتيب حسب cid لن يضر بأي شيء.

إعجاب واحد (1)

لا معنى له حقًا. المشكلة كالتالي، يجب أن يكون الصفان المميزان هما الردان الثاني والثالث في الموضوع، ولكن في Discourse هما في مكان ما بعد الموضع 500 لأنه هذا هو مكان الطابع الزمني الخاص بهما.

وبالطبع قررت Drupal تعيين created و changed ليكونوا نفس الشيء… ويحدث هذا فقط في بعض الأحيان، لا يمكنني تكراره بنفسي عن طريق تعديل المنشورات القديمة. ولكن لدي نفس المشكلة هذه في مواضيع متعددة طويلة الأمد حيث قام منشئ الموضوع بنشره ثم نشر فورًا تعليقًا أو تعليقين متابعين مع كلمة “reserved” في النص لإضافة معلومات لاحقًا، وهو ما فعله بعد عدة سنوات.

هذا منطقي، ولكن إليك نفس التعليق المعدل الإشكالي منتشرًا عبر الجدولين اللذين يستخدمهما:


إعجاب واحد (1)

حسنًا، يبدو أن هذا يعمل، فهو يصلح الخيطين المتشابكين اللذين وجدتهما ولا يبدو أنه يضر بأي شيء آخر.

  def import_replies

    batches(BATCH_SIZE) do |offset|
      results = mysql_query(<<-SQL
        SELECT c.cid, c.pid, c.nid, c.uid, c.created,
               f.comment_body_value body,
               f.comment_body_format format
          FROM comment c,
               field_data_comment_body f,
               node n
         WHERE c.cid = f.entity_id
           AND n.nid = c.nid
           AND c.status = 1
           AND n.type IN ('poll', 'forum')
           AND n.status = 1
           AND c.created > UNIX_TIMESTAMP(STR_TO_DATE('#{IMPORT_AFTER}', '%Y-%m-%d'))
         ORDER BY c.cid ASC  #--- Fixed
         LIMIT #{BATCH_SIZE}
        OFFSET #{offset}
      SQL
      ).to_a
إعجاب واحد (1)

حسنًا، يبدو أن هذا عاد ليؤذيني. نظرًا لأن الدالة postprocess_posts تستبدل الروابط الداخلية القديمة بعنوان URL الجديد لـ Discourse، فقد قمت بإنشاء استثناء في الكود للروابط https://web.archive.org/web/20230101093741/https://MyOldForum.com/node/98765 التي أنشأها المستورد الخاص بي لاستطلاعات Drupal القديمة في Wayback Machine. ولكن يبدو أن شيئًا ما قد سار بشكل خاطئ، لأنني لاحظت للتو في موقع الترحيل الإنتاجي أن الروابط انتهت بـ https://web.archive.org/web/20230101093741/https://MyOldForum.com/t/-/12345.

لذا، الآن بعد أن لم أعد في سياق حاوية ترحيل، هل لا يزال الحقل المخصص مع عقدة Drupal الأصلية nid متاحًا في جدول مواضيع Discourse؟ إذا كان الأمر كذلك، فسيبدو من الممكن إجراء استبدال للسلسلة في وحدة تحكم Rails على جميع المواضيع مع المنشور الأول الذي يحتوي على View this poll on the Wayback Machine ثم استبدال
https://web.archive.org/web/20230101093741/https://MyOldForum.com/t/-/[01234567890]*
بـ
https://web.archive.org/web/20230101093741/http://MyOldForum.com/node/$original_nid

إليك دالة استيراد الاستطلاع الأصلية الخاصة بي:

    def import_poll_topics
    puts '', "importing poll topics"

    polls = mysql_query(<<-SQL
      SELECT n.nid nid, n.title title, n.uid uid, n.created created, n.sticky sticky, taxonomy_index.tid tid, node_counter.totalcount views
        FROM node n
        LEFT JOIN taxonomy_index ON n.nid = taxonomy_index.nid
        LEFT JOIN node_counter ON n.nid = node_counter.nid
       WHERE n.type = 'poll'
         AND n.status = 1
    SQL
    ).to_a

    create_posts(polls) do |topic|
      {
        id: "nid:#{topic['nid']}",
        user_id: user_id_from_imported_user_id(topic['uid']) || -1,
        category: category_id_from_imported_category_id(topic['tid']),
        # Use TEMPmyoldforum.com or else postprocess_posts() will try to convert the Wayback Machine /node/YYY link
        raw: "### View this poll on the Wayback Machine:\n**https://web.archive.org/web/20230101093741/http://TEMPmyoldforum.com/node/#{topic['nid']}**",
        created_at: Time.zone.at(topic['created']),
        pinned_at: topic['sticky'].to_i == 1 ? Time.zone.at(topic['created']) : nil,
        title: topic['title'].try(:strip),
        views: topic['views'],
        custom_fields: { import_id: "nid:#{topic['nid']}" }
      }
    end
  end

نعم.

t=Topic.find(1234)
t.custom_fields
t.custom_fields['import_id']
إعجاب واحد (1)