خطأ ترحيل غريب في الاختبارات أثناء سير عمل GH

أحاول إنشاء علاقة مفتاح خارجي مع جدول المواضيع (Topics).
المشكلة هي أنها تفشل في بيئة اختبار سير عمل GitHub أثناء الاختبارات لسبب غريب للغاية، فهي تحاول الوصول إلى حقل من الجدول الأصل لم يعد موجودًا وتمت إزالته في ترحيل أساسي منذ سنوات!
الخطأ هو PG::UndefinedColumn: ERROR: column topics.off_topic_count does not exist
نعم، لأنه تم إزالته في ترحيل أساسي في عام 2018!
لقد أكدت أن هذا قد تم تشغيله بالفعل أثناء عملية الاختبار:

== 20180917024729 RemoveSuperfluousColumns: migrating =========================
== 20180917024729 RemoveSuperfluousColumns: migrated (0.0410s) ===============

أنا لا أشير بأي شكل من الأشكال إلى حقل الجدول الأصل القديم هذا بشكل صريح … يبدو أنه يقوم بإنشاء SQL بنفسه … ولكن بشكل غير مناسب للتعريف الحالي للأشياء.

== 20231119010101 CreateLocationsTopicTable: migrating ========================rake aborted!

[12035](https://github.com/paviliondev/discourse-locations/actions/runs/7039607316/job/19158951878?pr=103#step:19:12036)StandardError: An error has occurred, this and all later migrations canceled: (StandardError)

[12036](https://github.com/paviliondev/discourse-locations/actions/runs/7039607316/job/19158951878?pr=103#step:19:12037)

[12037](https://github.com/paviliondev/discourse-locations/actions/runs/7039607316/job/19158951878?pr=103#step:19:12038)PG::UndefinedColumn: ERROR: column topics.off_topic_count does not exist

[12038](https://github.com/paviliondev/discourse-locations/actions/runs/7039607316/job/19158951878?pr=103#step:19:12039)LINE 1: ...cs"."deleted_at", "topics"."highest_post_number", "topics"...

تعريف الجدول بسيط للغاية:

class CreateLocationsTopicTable < ActiveRecord::Migration[7.0]
  def change
    create_table :locations_topic do |t|
      t.references :topic, foreign_key: true
      t.float :latitude, null: false

SNIP

الجزء الأكثر غرابة هو أن هذا الترحيل يعمل في بيئة الإنتاج!
أي رؤى موضع ترحيب كبير!

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

أوه، لقد تم خداعي جيدًا بسبب هذا :policeman: :police_car:

المخالفات:

db/migrate/20231119010101_create_locations_topic_table.rb:6:7: C: Discourse/NoAddReferenceOrAliasesActiveRecordMigration: طرق AR add_reference، add_belongs_to، t.references، و t.belongs_to هي
عالية المخاطر للجداول الكبيرة وتحتوي على الكثير من عمليات السحر الخلفية.
بدلاً من ذلك، اكتب ترحيل disable_ddl_transactions! واكتب SQL مخصصًا
لإضافة العمود الجديد و CREATE INDEX CONCURRENTLY. استخدم عبارة IF NOT EXISTS
لجعل الترحيل قابلاً لإعادة التشغيل إذا فشل في منتصف الطريق.

      t.references :topic, foreign_key: true
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

الآن هذا قد يكون جزءًا من المشكلة.
الكثير من :magic_wand: يحدث، هذه هي المشكلة!
أنت تعيش وتتعلم! :mortar_board:

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

نصيحة rubocop جيدة، لكنني لا أعتقد أنها سبب هذا الخطأ. (يشير “الخطر” الذي تذكره إلى الأقفال على الجداول ذات حركة المرور العالية والتي من شأنها أن تؤثر على حركة الإنتاج. لذا فهي ليست شيئًا قد يسبب أخطاء في بيئة الاختبار)

يمكنك على الأرجح إعادة إنتاج نفس الخطأ محليًا عن طريق القيام بـ RAILS_ENV=test bin/rake db:drop db:create db:migrate (أي ترحيل قاعدة بيانات تمامًا من الصفر، مع تمكين المكون الإضافي للمواقع)

أشك في أن المشكلة هي أنك تستدعي مهام Rake داخل ترحيل. في النواة، نتجنب بشكل عام تشغيل أي نوع من أكواد التطبيق في الترحيلات بسبب الآثار الجانبية الغريبة التي يمكن أن تحدث. من الأفضل الالتزام بـ SQL الخام.

في هذه الحالة، أفترض أن ذاكرة التخزين المؤقت لمخطط ActiveRecord يتم ملؤها في وقت مبكر من الترحيلات (عندما لا يزال topics.off_topic_count موجودًا). بعد ذلك، عندما تعمل مهمة Rake الخاصة بك، فإنها تعمل بذاكرة تخزين مؤقت قديمة للمخطط، لذا تحاول ActiveRecord تحميل أعمدة لم تعد موجودة.

يمكنك على الأرجح التخفيف من ذلك عن طريق إضافة ActiveRecord::Base.clear_cache! قبل استدعاء مهام Rake… ولكن لا تعتبر ذلك توصية :wink:. أفضل شيء هو تجنب استدعاء مهام Rake تمامًا. إذا كنت بحاجة إلى معالجة شيء ما في قاعدة البيانات، فاستخدم SQL خام داخل الترحيل.

إعجابَين (2)

شكراً ديفيد، سأنقله إلى عبارة SQL وأرى ما إذا كان ذلك سيحل المشكلة…

هذا هو الحل، شكرًا ديفيد!

إعجابَين (2)

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.