रेल में "सूचकांक unique_schema_migrations पहले से मौजूद है" को हल कैसे करूं?

रेक डीबी: माइग्रेट चल रहा है <�कोड> रेक परीक्षण: इकाइयां निम्नलिखित उत्पन्न करता है:

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 एडाप्टर का उपयोग कर रहा हूं। (यानी, rm db/* sqlite3 चल रहा है रेक डीबी: माइग्रेट मदद नहीं करता है।)

क्या test: इकाइयां कार्य शायद स्कीमा को फिर से लोड करने का प्रयास कर रहा है? यदि हां, तो क्यों? क्या यह स्कीमा को पहले से अद्यतित नहीं करना चाहिए?

4
Schema.rb में schema_migrations तालिका के लिए निश्चित रूप से कोई अन्य अनुक्रमणिका घोषणाएं नहीं हैं। बग MySQL पर नहीं होता है, दिलचस्प रूप से पर्याप्त है, हालांकि।
जोड़ा लेखक James A. Rosen, स्रोत
मेरे पास table_name_prefix का उपयोग करने के साथ कुछ भी हो सकता है। एक रेक डीबी करते समय: स्कीमा: लोड, मुझे दोगुनी-प्रीफिक्स्ड टेबल मिलते हैं।
जोड़ा लेखक James A. Rosen, स्रोत

3 उत्तर

SQLite में, डेटाबेस स्तर पर इंडेक्स नाम विशिष्टता लागू की जाती है। MySQL में, विशिष्टता केवल तालिका स्तर पर लागू होती है। यही कारण है कि आपके माइग्रेशन बाद में काम करते हैं और पूर्व में नहीं: आपके पास अलग-अलग तालिकाओं पर एक ही नाम के साथ दो अनुक्रमणिका हैं।

इंडेक्स का नाम बदलें, या अन्य unique_schema_migrations अनुक्रमणिका को ढूंढें और नाम बदलें, और आपके माइग्रेशन को काम करना चाहिए।

14
जोड़ा
लैरवेल में मुझे एक ही समस्या थी, जब परीक्षण माइग्रेट करना शुरू होता है तो यह कहता है कि इंडेक्स पहले से मौजूद है। मैंने सभी इंडेक्स को अद्वितीय नाम (तालिका का नाम तैयार करने) के लिए बदल दिया और यह काम किया। मेरा मानना ​​है कि यह सही जवाब है।
जोड़ा लेखक morksinaanab, स्रोत

आपके डेटाबेस.आईएमएल फ़ाइल में विकास और परीक्षण के लिए विभिन्न डेटाबेस से कनेक्ट करने के लिए आपके वातावरण सेटअप किए गए हैं?

अर्थात:

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
जोड़ा