سؤال

لدي عملية ترحيل تقوم بتشغيل برنامج نصي SQL لإنشاء مخطط Postgres جديد.عند إنشاء قاعدة بيانات جديدة في Postgres افتراضيًا، يتم إنشاء مخطط يسمى "عام"، وهو المخطط الرئيسي الذي نستخدمه.يبدو أن الترحيل لإنشاء مخطط قاعدة البيانات الجديد يعمل بشكل جيد، ولكن المشكلة تحدث بعد تشغيل الترحيل، عندما تحاول Rails تحديث جدول "schema_info" الذي تعتمد عليه، تقول إنه غير موجود، كما لو كان كذلك. ابحث عنه في مخطط قاعدة البيانات الجديد وليس المخطط الافتراضي "العامة" حيث يوجد الجدول بالفعل.

هل يعرف أحد كيف يمكنني إخبار القضبان بالنظر إلى المخطط "العامة" لهذا الجدول؟

مثال على SQL الذي يتم تنفيذه:~

CREATE SCHEMA new_schema;
COMMENT ON SCHEMA new_schema IS 'this is the new Postgres database schema to sit along side the "public" schema';
-- various tables, triggers and functions created in new_schema

خطأ في الرمي:~

RuntimeError: ERROR C42P01  Mrelation "schema_info" does not exist
L221    RRangeVarGetRelid: UPDATE schema_info SET version = ??

شكرا لمساعدتك

كريس نايت

هل كانت مفيدة؟

المحلول

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

لكن اعلم أنه بشكل عام، لا تعمل Rails ومخططات Postgresql معًا بشكل جيد (حتى الآن؟).

هناك عدد قليل من الأماكن التي لديها مشاكل.حاول إنشاء تطبيق يستخدم قاعدة بيانات pg واحدة فقط مع مخططين غير افتراضيين، أحدهما للتطوير والآخر للاختبار وأخبرني عنه.(مما يلي أستطيع أن أخبرك بالفعل أنك سوف تحترق)

ربما تم إصلاحه منذ آخر مرة لعبت بها ولكن عندما أرى http://rails.lighthouseapp.com/projects/8994/tickets/390-postgres-adapter-quotes-table-name-breaks-when-non-default-schema-is-used أو هذا http://rails.lighthouseapp.com/projects/8994/tickets/918-postgresql-tables-not-geneating-correct-schema-list أو هذا في postgresql_adapter.rb

  # Drops a PostgreSQL database
  #
  # Example:
  #   drop_database 'matt_development'
  def drop_database(name) #:nodoc:
    execute "DROP DATABASE IF EXISTS #{name}"
  end

(نعم، هذا خطأ إذا كنت تستخدم نفس قاعدة البيانات بمخططات مختلفة لكل من التطوير والاختبار، فسيؤدي ذلك إلى إسقاط قاعدتي البيانات في كل مرة تقوم فيها بتشغيل اختبارات الوحدة!)

لقد بدأت بالفعل في كتابة التصحيحات.الأول كان لطرق الفهارس في المحول الذي لم يهتم بأن ينتهي الأمر بـ search_path بفهرسات مكررة في بعض الحالات، ثم بدأت أتألم من الباقي وانتهى بي الأمر بالتخلي عن فكرة استخدام المخططات:أردت الحصول على لي تم الانتهاء من التطبيق ولم يكن لدي الوقت الإضافي اللازم لإصلاح المشكلات التي واجهتها في استخدام المخططات.

نصائح أخرى

لست متأكدًا من أنني أفهم ما تطلبه بالضبط، ولكن يتوقع rake تحديث إصدار مخطط Rails في جدول schema_info.تحقق من ملف التكوين الخاص بقاعدة البيانات.yml، حيث سيبحث rake عن الجدول المطلوب تحديثه.

هل من المحتمل أنك تهاجر إلى مخطط Postgres جديد ولا تزال أشعل النار تشير إلى المخطط القديم؟لست متأكدًا إذن من أن ترحيل Rails القياسي هو ما تحتاجه.قد يكون من الأفضل إنشاء مهمة أشعل النار الخاصة بك بدلاً من ذلك.

يحرر:إذا كنت تشير إلى قاعدتي بيانات مختلفتين أو مخططات Postgres، فإن Rails لا يدعم ذلك في عمليات الترحيل القياسية.تفترض ريلز قاعدة بيانات واحدة، لذلك عادةً ما يكون الترحيل من قاعدة بيانات إلى أخرى غير ممكن.عندما تقوم بتشغيل "rake db:migrate" فإنه يبحث فعليًا في متغير البيئة RAILS_ENV للعثور على الإدخال الصحيح في قاعدة البيانات.yml.إذا بدأ rake الترحيل بالنظر إلى بيئة "التطوير" وتكوين قاعدة البيانات من قاعدة البيانات.yml، فإنه يتوقع التحديث إلى هذه البيئة في نهاية الترحيل.

لذلك، ربما ستحتاج إلى القيام بذلك من خارج مكدس Rails حيث لا يمكنك الرجوع إلى قاعدتي بيانات في نفس الوقت داخل Rails.هناك محاولات للمكونات الإضافية للسماح بذلك، لكنها مخترقة إلى حد كبير ولا تعمل بشكل صحيح.

يمكنك استخدام pg_power.يوفر DSL إضافيًا للترحيل لإنشاء مخططات PostgreSQL وليس فقط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top