كيف أقوم بحل "index_schema_migrations index" بالفعل في Rails؟

تشغيل rake db: migrate ثم rake test: units ينتج ما يلي:

rake test:functionals
(in /projects/my_project)
rake aborted!
SQLite3::SQLException: index unique_schema_migrations already exists: CREATE UNIQUE INDEX "unique_schema_migrations" ON "ts_schema_migrations" ("version")

الجزء ذو الصلة من db/schema.rb هو كالتالي:

create_table "ts_schema_migrations", :id => false, :force => true do |t|
  t.string "version", :null => false
end

add_index "ts_schema_migrations", ["version"], :name => "unique_schema_migrations", :unique => true

لا أقوم بتغيير هذا الفهرس يدويًا في أي مكان ، وأنا أستخدم محول SQLite3 الافتراضي بقناة Rails مع قاعدة بيانات جديدة تمامًا. (أي ، تشغيل rm db/* sqlite3 قبل rake db: migrate لا يساعد.)

هل test: units مهمة ربما تحاول إعادة تحميل المخطط؟ إذا كان الأمر كذلك لماذا؟ ألا ينبغي أن يتعرف على المخطط محدثًا بالفعل؟

4
توجد بالتأكيد أي تعريفات فهرس أخرى لجدول schema_migrations في schema.rb. لا يحدث هذا الخطأ على MySQL ، ولكن من المثير للاهتمام.
وأضاف المؤلف James A. Rosen, مصدر
قد يكون له أيضًا شيء يتعلق باستخدامي table_name_prefix. عند إجراء a rake db: schema: load ، أحصل على جداول مسبقة المضاعفة.
وأضاف المؤلف James A. Rosen, مصدر

3 إجابة

في SQLite ، يتم فرض تفرد اسم الفهرس على مستوى قاعدة البيانات. في MySQL ، يتم فرض التفرد فقط على مستوى الجدول. ولهذا السبب تعمل عمليات الترحيل الخاصة بك في الأخير وليس السابق: لديك فهرسين يحملان نفس الاسم على جداول مختلفة.

أعد تسمية الفهرس ، أو ابحث عن الفهرس unique_schema_migrations الآخر وأعد تسميته ، ويجب أن تعمل عمليات الترحيل.

14
وأضاف
واجهت نفس المشكلة في Laravel ، عندما يختبر بدء ترحيلها تقول إن المؤشر موجود بالفعل. لقد غيرت جميع المؤشرات لتكون اسمًا فريدًا (تقديم اسم الجدول مسبقًا) وعملت. هذه هي الإجابة الصحيحة على ما أعتقد.
وأضاف المؤلف morksinaanab, مصدر

في ملف database.yml الخاص بك ، يتم إعداد البيئات الخاصة بك للاتصال بقواعد بيانات مختلفة للتطوير والاختبار؟

أي:

development:
  adapter: sqlite3
  database: db/dev.sqlite3
  timeout: 5000

test:
  adapter: sqlite3
  database: db/test.sqlite3
  timeout: 5000
2
وأضاف

Try to search if your schema.rb file does not contain other declarations that create an index with the same name: unique_schema_migrations

0
وأضاف