जांचें कि क्या कोई तालिका रेल में मौजूद है


174

मेरे पास एक रेक कार्य है जो तब तक काम नहीं करेगा जब तक कि कोई तालिका मौजूद न हो। मैं एक वेबसाइट पर 20 से अधिक इंजीनियरों के साथ काम कर रहा हूं, इसलिए मैं यह सुनिश्चित करना चाहता हूं कि वे तालिका को माइग्रेट कर चुके हैं इससे पहले कि वे एक रेक कार्य कर सकते हैं जो उस संबंधित तालिका को आबाद करेगा।

क्या AR में कोई विधि है जैसे Table.exists? मैं यह कैसे सुनिश्चित कर सकता हूं कि वे सफलतापूर्वक टेबल पर चले गए हैं?


12
चुटकुला चला जाता है .. एक टेबल पर माइग्रेट करने के लिए कितने इंजीनियर लगते हैं :)
ज़बबा

1
उत्पादन पर 1. मंचन दर्जनों और कई बार प्रत्येक पर।
तत्कालीन जेंग

2
क्या यह आसान नहीं होगा कि आप अपने रेक कार्य की शुरुआत में माइग्रेशन चलाएं? तो आप लापता टेबल के बारे में चिंता करने की जरूरत नहीं है।
रसखडफ़ी

@raskhadafi: ध्यान दें कि यदि आपके कॉन्‍फ़िगरेशन / इनिशियलाइज़र इनका उपयोग करते हैं, तो लापता टेबल आपको एक समस्या देने वाली है। (यानी rake db:migrateफेल भी होंगे।)
ओद्दो

जवाबों:


302

रेल 5 में एपीआई तालिकाओं / विचारों , सामूहिक रूप से डेटा स्रोतों के बारे में स्पष्ट हो गई

# Tables and views
ActiveRecord::Base.connection.data_sources
ActiveRecord::Base.connection.data_source_exists? 'kittens'

# Tables
ActiveRecord::Base.connection.tables
ActiveRecord::Base.connection.table_exists? 'kittens'

# Views
ActiveRecord::Base.connection.views
ActiveRecord::Base.connection.view_exists? 'kittens'

रेल 2, 3 और 4 में एपीआई तालिकाओं के बारे में है ।

# Listing of all tables and views
ActiveRecord::Base.connection.tables

# Checks for existence of kittens table/view (Kitten model)
ActiveRecord::Base.connection.table_exists? 'kittens'

पलायन की स्थिति प्राप्त करना:

# Tells you all migrations run
ActiveRecord::Migrator.get_all_versions

# Tells you the current schema version
ActiveRecord::Migrator.current_version

यदि आपको माइग्रेशन या मेटाडेटा के लिए अधिक API की आवश्यकता है:


4
ActiveRecord::Base.connection.table_exist 'users'एक उपयोगकर्ता तालिका के लिए जाँच करेगा।
तत्कालीन जेंग

4
ActiveRecord::Base.connection.table_exists? 'kittensएक बिल्ली का बच्चा तालिका के लिए जाँच करेगा। जब तक मैंने सभी बिल्ली के बच्चों को नष्ट नहीं किया है! drop_table :kittens
तत्कालीन जेंग

1
धन्यवाद दोस्तों! मैंने अभी उपयोग किया है.index_exists?('kittens', 'paws')
ट्रिप

14
यह ActiveRecord 3.2.11 के लिए काम करता है drop_table(:hosts_users) if table_exists? :hosts_users
ग्रेग

1
ActiveRecord::Base.connection.data_source_exists? 'table_name'अब एक सही है
डोरियन

57

भले ही टेबल मौजूद न हो:

मॉडल Kitten, अपेक्षित तालिका kittens रेल 3:

Kitten.table_exists? # => असत्य


+ 1 और सुरुचिपूर्ण समाधान। यह भी काम करता है कि मॉडल तालिका के नाम से आगे निकल जाए।
डैनियल रिकोस्की

1
रेल 2.3.18-lts के लिए इस काम की पुष्टि करते हुए (एक तालिका के साथ परीक्षण किया गया है, एक स्क्रिप्ट / कंसोल चलाने से पहले गायब है)
iheggie

32

जब मैं एक प्रवास के माध्यम से एक तालिका को हटाने की कोशिश कर रहा था तो मुझे यह पता चला:

drop_table :kittens if (table_exists? :kittens)
ActiveRecord::Migration.drop_table :kittens if (ActiveRecord::Base.connection.table_exists? :kittens)

रेल 3.2 के लिए काम करता है

यह सरल रूप रेल 5 में उपलब्ध हो जाएगा:

drop_table :kittens, if_exists: true

संदर्भ: https://github.com/rails/rails/pull/16366

और यहां रेल्स 5 ActiveRecord का चैनल है :

परिचय: if_exists विकल्प drop_table के लिए।

उदाहरण:

drop_table(:posts, if_exists: true)

यह निष्पादित करेगा:

DROP TABLE IF EXISTS posts

यदि तालिका मौजूद नहीं है, if_exists: false (डिफ़ॉल्ट) एक अपवाद उठाता है जबकि if_exists: true कुछ नहीं करता है।


यदि तालिका वास्तव में एक दृश्य है, तो यह विफल हो जाएगा, क्योंकि तालिका मौजूद होगी, लेकिन DROP टेबल इसे नहीं छोड़ सकता है।
MCR

8

रेलगाड़ी ५.१

if ActiveRecord::Base.connection.data_source_exists? 'table_name'
   drop_table :table_name
end

या

drop_table :table_name, if_exists: true

2
table_exists अभी भी रेल -5 में काम करता है, लेकिन इसका व्यवहार केवल चेक टेबल में बदल जाएगा। 5.0.1 तक यह दृश्य और तालिकाओं की जाँच करता है। data_source_exists रखता है कि व्यवहार और table_exists केवल जाँच तालिकाओं में बदल रहे हैं।
जॉन नेगल

वह एक प्रवास पर तालिका की जांच करने के लिए नहीं कह रहा है, उसे यह सुनिश्चित करने की आवश्यकता है कि तालिका एक रेक कार्य पर मौजूद है
जुआन फुरतिनी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.