रेल डीबी प्रवासन - एक तालिका कैसे गिराएं?


506

मैंने एक तालिका जोड़ी जो मुझे लगा कि मुझे ज़रूरत है, लेकिन अब इसका उपयोग करने की योजना नहीं है। मुझे उस तालिका को कैसे निकालना चाहिए?

मैंने पहले ही माइग्रेशन चला लिया है, इसलिए तालिका मेरे डेटाबेस में है। मुझे यह पता लगाने में rails generate migrationसक्षम होना चाहिए, लेकिन मुझे अभी तक पता नहीं चला है।

मैंने कोशिश की:

rails generate migration drop_tablename

लेकिन यह सिर्फ एक खाली प्रवास उत्पन्न हुआ।

रेलों में टेबल गिराने का "आधिकारिक" तरीका क्या है?


1
चूंकि rails generate migrationटेबल बनाने, जोड़ने या कॉलम बदलने आदि के लिए माइग्रेशन कोड बनाने के लिए कमांड-लाइन विकल्प हैं, इसलिए अच्छा होगा यदि इसमें टेबल ड्रॉप करने का विकल्प भी हो - लेकिन ऐसा नहीं है। निश्चित रूप से, upभाग लिखना सरल है - बस कॉल करें drop_table- लेकिन downभाग, तालिका को फिर से बनाना, हमेशा इतना सरल नहीं हो सकता है, खासकर यदि प्रश्न में तालिका के स्कीमा को इसके प्रारंभिक निर्माण के बाद माइग्रेशन द्वारा बदल दिया गया हो। शायद किसी को रेल के डेवलपर्स को सुझाव देना चाहिए कि इस तरह के विकल्प को जोड़ना एक अच्छा विचार होगा।
तेमु लेइस्टि

3
@TeemuLeisti स्कीमा से वर्तमान तालिका परिभाषा को कॉपी और पेस्ट कैसे करें? मैं इसे हर समय इस तरह से करता
हूं

1
@ जोआ सोरेस: ठीक है, मुझे लगता है कि काम करता है। हालांकि, यह अच्छा होगा यदि प्रक्रिया स्वचालित हो सकती है, ताकि आप बस एक rakeमाइग्रेशन-निर्माण कमांड दे सकें , एक पैरामीटर के रूप में तालिका के नाम के साथ, जो आवश्यक upऔर downकार्यों का उत्पादन करेगा ।
तैमू लीस्टी

जवाबों:


646

आप हमेशा वह कोड नहीं बना पाएंगे जो आप चाहते हैं। आप एक खाली माइग्रेशन बना सकते हैं और फिर उसे उस कोड के साथ पॉप्युलेट कर सकते हैं जिसकी आपको आवश्यकता है।

आप यहां माइग्रेशन में विभिन्न कार्यों को पूरा करने के बारे में जानकारी पा सकते हैं:

http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

अधिक विशेष रूप से, आप देख सकते हैं कि निम्नलिखित दृष्टिकोण का उपयोग करके तालिका कैसे छोड़ें:

drop_table :table_name

3
इसने मेरे लिए भी काम किया। लेकिन पूर्ण माइग्रेशन (खरोंच से स्थापित) पर तालिका अब पहले बनाई जाएगी और बाद में फिर से गिर जाएगी। क्या सड़क से पलायन कम करना और छोड़ना सुरक्षित है?
20

2
यहाँ पर कोई दृश्य है कि क्या तालिकाओं को छोड़ना या पिछले डेटाबेस स्कीमा को वापस करना बेहतर है?
वियना

3
यदि आप तालिका के साथ काम कर रहे हैं और अब इसका उपयोग करने की योजना नहीं बना रहे हैं, तो मैं कहूंगा कि इसे छोड़ दें अगर इसका उपयोग नहीं किया जा रहा है तो इससे छुटकारा पाने के लिए बेहतर है।
पीट

6
@BederAcostaBorges द्वारा उत्तर अधिक आत्म-व्याख्यात्मक और सटीक है
onerinas

2
सभी विदेशी कुंजियों को कैसे हटाएं? अन्य तालिकाओं में स्तंभ हैं जो तालिका को गिराए जाने की ओर इशारा करते हैं।
मार्टिन कोनिसक

352

पहले किसी भी नाम के साथ एक खाली माइग्रेशन उत्पन्न करें जिसे आप पसंद करेंगे। यह इस तरह से करना महत्वपूर्ण है क्योंकि यह उचित तारीख बनाता है।

rails generate migration DropProductsTable

यह 20111015185025_drop_products_table.rb में / .bb / माइग्रेट / .rb फ़ाइल उत्पन्न करेगा

अब इस तरह से देखने के लिए उस फाइल को एडिट करें:

class DropProductsTable < ActiveRecord::Migration
  def up
    drop_table :products
  end

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

केवल एक चीज जो मैंने जोड़ी थी drop_table :productsऔर थी raise ActiveRecord::IrreversibleMigration

फिर दौड़ो rake db:migrateऔर यह तुम्हारे लिए टेबल गिरा देगा।


14
एक डाउन माइग्रेशन का उपयोग ड्रॉप की जा रही तालिका को फिर से बनाने के लिए किया जाना चाहिए।
fflyer05

1
विकास में भी इस प्रवास को वापस नहीं लाया जा सका। क्या बेहतर होगा कि आप डाउन माइग्रेशन को खाली छोड़ दें?
मेहरिष

1
यह बेहतर उत्तर है + फेलियर की टिप्पणी
ज़ैक शापिरो

2
@mjnissim और fflyer05 सही हैं, किसी भी अजीब चीज से बचने के लिए आपको नीचे दी गई विधि में तालिका को फिर से बनाना चाहिए।
सेबेस्टियलोनो

4
टेबल को छोड़ने से सारा डेटा डिलीट हो जाता है, अगर आप इसे उस downतरीके से रीक्रिएट करते हैं जो आप इसे रिकवर नहीं करेंगे तो यह वास्तव में एक उचित रोल बैक नहीं है। यह स्पष्ट रूप से इंगित करना बेहतर है कि प्रवासन एक गलत अर्थ देने की तुलना में अपरिवर्तनीय है जिसे इससे पुनर्प्राप्त किया जा सकता है।
विवि

314

अपना माइग्रेशन मैन्युअल रूप से लिखें। जैसे दौड़ना rails g migration DropUsers

माइग्रेशन कोड के लिए मैं सिर्फ मैक्सवेल होल्डर की पोस्ट रेल माइग्रेशन चेकलिस्ट को उद्धृत करने वाला हूं

बीएडी - चल रहा है rake db:migrateऔर फिर rake db:rollbackविफल हो जाएगा

class DropUsers < ActiveRecord::Migration
  def change
    drop_table :users
  end
end

अच्छा - इरादे का पता चलता है कि प्रवास प्रतिवर्ती नहीं होना चाहिए

class DropUsers < ActiveRecord::Migration
  def up
    drop_table :users
  end

  def down
    fail ActiveRecord::IrreversibleMigration
  end
end

बेहतर - वास्तव में प्रतिवर्ती है

class DropUsers < ActiveRecord::Migration
  def change
    drop_table :users do |t|
      t.string :email, null: false
      t.timestamps null: false
    end
  end
end

यदि आप ब्लॉक से काट रहे हैं और चिपका रहे हैं schema.rb, तो schema.rbविदेशी कुंजियों की खोज करना भी न भूलें । फिर drop_tableब्लॉक में विदेशी कुंजी परिभाषा जोड़ें , जैसे:t.foreign_key "other_table"
लेनचो रेयेस

197

जबकि यहां दिए गए उत्तर ठीक से काम करते हैं, मैं कुछ और 'सीधा' चाहता था, मुझे यह यहां मिला: लिंक सबसे पहले प्रवेश करें:

$rails console

फिर बस टाइप करें:

ActiveRecord::Migration.drop_table(:table_name)

और किया, मेरे लिए काम किया!


मॉडल अभी भी वहाँ है जब तक आप चलाते हैंrails destroy model User
gm2008

2
इसे केवल तभी चलाएं जब आप अच्छे के लिए तालिका से छुटकारा चाहते हैं। रेल इस बूंद से अनजान होंगी। इस कमांड को चलाने के बाद माइग्रेशन टूट जाता है। क्रिएट नहीं कर सकते, DROP ... ETC। ERROR SQLite3 :: SQLException: ऐसी कोई तालिका नहीं: उच्चारण: DROP टेबल "कुछ"
zee

36

आपको निम्न आदेश का उपयोग करके एक नई माइग्रेशन फ़ाइल बनाने की आवश्यकता है

rails generate migration drop_table_xyz

और नवगठित माइग्रेशन फ़ाइल (db / प्रवास / xxxxxxx_drop_table_xyz) की तरह drop_table कोड लिखें

drop_table :tablename

या यदि आप माइग्रेशन के बिना तालिका छोड़ना चाहते हैं, तो बस रेल कंसोल को खोलें

$ rails c

और कमांड का पालन करें

ActiveRecord::Base.connection.execute("drop table table_name")

या आप अधिक सरलीकृत आदेश का उपयोग कर सकते हैं

ActiveRecord::Migration.drop_table(:table_name)

21
  1. रेल g माइग्रेशन drop_users
  2. प्रवास संपादित करें
    class DropUsers < ActiveRecord::Migration
      def change
        drop_table :users do |t|
          t.string :name
          t.timestamps
        end
      end
    end
  1. रेक डीबी: माइग्रेट

13

मुझे लगता है, पूरी तरह से "आधिकारिक" होने के लिए, आपको एक नया माइग्रेशन बनाने की आवश्यकता होगी, और drop.table को self.up में डालना होगा। सेल्फडाउन विधि में तब तालिका को पूर्ण बनाने के लिए सभी कोड होने चाहिए। संभवतः उस कोड को स्कीमा से लिया जा सकता है। उस समय जब आप माइग्रेशन बनाते हैं।

यह थोड़ा अजीब लगता है, कोड बनाने के लिए एक तालिका बनाने के लिए जिसे आप जानते हैं कि आपको अब और ज़रूरत नहीं है, लेकिन यह सभी माइग्रेशन कोड को पूर्ण और "आधिकारिक" रखेगा, है ना?

मैंने ऐसा सिर्फ एक टेबल के लिए किया था जिसे मुझे छोड़ने की ज़रूरत थी, लेकिन ईमानदारी से "डाउन" का परीक्षण नहीं किया और मुझे यकीन नहीं था कि मैं क्यों करूंगा।


1
अजीब है, लेकिन ऐसा लगता है कि मुझे भी ऐसा करना होगा।
digitalWestie

7
या आप बस का उपयोग कर सकते हैं: raise ActiveRecord::IrreversibleMigrationself.down विधि में, ताकि आप कम से कम अपने आप को एक त्रुटि / सूचना दें यदि आप कभी भी रोलबैक करने का प्रयास करते हैं।
Steph रोज

1
मैं नीचे का परीक्षण सिर्फ इसलिए करूंगा क्योंकि अन्यथा मैं अपनी परियोजना में अप्रमाणित कोड प्रस्तुत कर रहा हूं। मैं मूल माइग्रेशन अप विधि का पुन: उपयोग कैसे कर सकता हूं? मैंने कोशिश की है CreateMyTable.upऔर ActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, X)जहां एक्स माइग्रेशन है, जो मूल रूप से टेबल बनाया है, लेकिन दोनों काम नहीं करता है - दोनों दृष्टिकोणों में, एआर पहले जांचता है कि क्या माइग्रेशन पहले ही लागू किया जा चुका है, और अगर यह है तो चुपचाप इसे छोड़ देता है। `
इसहाक बेतेश

12

आप बस रेल कंसोल से एक टेबल गिरा सकते हैं। पहले कंसोल खोलें

$ rails c

फिर इस कमांड को कंसोल में पेस्ट करें

ActiveRecord::Migration.drop_table(:table_name)

उस तालिका से तालिका_नाम बदलें , जिसे आप हटाना चाहते हैं।

आप टर्मिनल से सीधे टेबल भी छोड़ सकते हैं। बस अपने एप्लिकेशन की रूट डायरेक्टरी में प्रवेश करें और इस कमांड को रन करें

$ rails runner "Util::Table.clobber 'table_name'"

10

सरल और आधिकारिक तरीका यह होगा:

  rails g migration drop_tablename

अब अपने डीबी / माइग्रेट पर जाएं और अपनी फ़ाइल देखें जिसमें ड्रॉपनेम के रूप में फ़ाइल नाम है और इसे इस पर संपादित करें।

    def change
      drop_table :table_name
    end

फिर आपको दौड़ने की जरूरत है

    rake db:migrate 

अपने कंसोल पर।


9

आप एक माइग्रेशन को वापस उसी तरह से रोल कर सकते हैं जैसे वह गाइड में है:

http://guides.rubyonrails.org/active_record_migrations.html#reverting-previous-migrations

माइग्रेशन जनरेट करें:

rails generate migration revert_create_tablename

माइग्रेशन लिखें:

require_relative '20121212123456_create_tablename'

class RevertCreateTablename < ActiveRecord::Migration[5.0]
  def change
    revert CreateTablename    
  end
end

इस तरह से आप रोलबैक भी कर सकते हैं और किसी भी माइग्रेशन को वापस लाने के लिए उपयोग कर सकते हैं


8

अपवाद को बढ़ाने या अब खाली तालिका को फिर से बनाने का प्रयास - जबकि अभी भी माइग्रेशन रोलबैक, रीडो आदि को सक्षम करना -

def change
  drop_table(:users, force: true) if ActiveRecord::Base.connection.tables.include?('users')
end

8

मैं इसे माइग्रेशन स्क्रिप्ट के साथ काम करने में सक्षम नहीं था इसलिए मैं इस समाधान के साथ आगे बढ़ा। टर्मिनल का उपयोग करके रेल कंसोल दर्ज करें:

rails c

प्रकार

ActiveRecord::Migration.drop_table(:tablename)

ये मेरे लिए अच्छी तरह से काम करता है। यह पिछली तालिका को हटा देगा। दौड़ना न भूलें

rails db:migrate



2

मुझे अपने माइग्रेशन स्क्रिप्ट को तालिकाओं के साथ स्वयं हटाने की आवश्यकता थी ...

class Util::Table < ActiveRecord::Migration

 def self.clobber(table_name)   
    # drop the table
    if ActiveRecord::Base.connection.table_exists? table_name
      puts "\n== " + table_name.upcase.cyan + " ! " 
           << Time.now.strftime("%H:%M:%S").yellow
      drop_table table_name 
    end

    # locate any existing migrations for a table and delete them
    base_folder = File.join(Rails.root.to_s, 'db', 'migrate')
    Dir[File.join(base_folder, '**', '*.rb')].each do |file|
      if file =~ /create_#{table_name}.rb/
        puts "== deleting migration: " + file.cyan + " ! "
             << Time.now.strftime("%H:%M:%S").yellow
        FileUtils.rm_rf(file)
        break
      end
    end
  end

  def self.clobber_all
    # delete every table in the db, along with every corresponding migration 
    ActiveRecord::Base.connection.tables.each {|t| clobber t}
  end

end

टर्मिनल विंडो रन से:

$ rails runner "Util::Table.clobber 'your_table_name'"

या

$ rails runner "Util::Table.clobber_all"


1

Daud

rake db:migrate:down VERSION=<version>

<version>आपकी माइग्रेशन फ़ाइल का संस्करण क्रमांक कहां है जिसे आप वापस करना चाहते हैं।

उदाहरण:-

rake db:migrate:down VERSION=3846656238

1

अगर कोई SQL में इसे करने के लिए देख रहा है।

rails dbconsoleटर्मिनल से टाइप करें

पास वर्ड दर्ज करें

कंसोल में करते हैं

USE db_name;

DROP TABLE table_name;

exit

कृपया स्कीमा से माइग्रेशन फ़ाइल और तालिका संरचना को निकालना न भूलें


आप इसे सिर्फ टाइप करके भी खोल सकते हैंrails db
ARK

0

यदि आप एक विशिष्ट तालिका छोड़ना चाहते हैं जो आप कर सकते हैं

$ rails db:migrate:up VERSION=[Here you can insert timestamp of table]

अन्यथा यदि आप अपने सभी डेटाबेस को छोड़ना चाहते हैं जो आप कर सकते हैं

$rails db:drop

-1

ड्रॉप टेबल / प्रवासन

रन: - $ रेल माइग्रेशन DropTablename उत्पन्न करते हैं

exp: - $ rails माइग्रेशन DropProducts जनरेट करते हैं


-1

यह आदेश चलाएँ: -

rails g migration drop_table_name

फिर:

rake db:migrate

या यदि आप MySql डेटाबेस का उपयोग कर रहे हैं तो:

  1. डेटाबेस के साथ लॉगिन करें
  2. show databases;
  3. show tables;
  4. drop table_name;

3
क्या यह उत्तर मौजूदा, स्वीकृत उत्तर के लिए कुछ भी जोड़ता है? यदि नहीं, तो इसे पोस्ट करने की कोई आवश्यकता नहीं है।
टॉम भगवान

1
यह पहले से ही सवाल में कहा गया है, रेल 4.2 में एक खाली प्रवास बनाता है।
बर्ट ब्रुइनोगे

यह वास्तव में ओपी ने मूल रूप से क्या कोशिश की ... इस उत्तर को हटा दिया जाना चाहिए
वेबहॉलिक

एक साधारण उत्तर जोड़ने से अधोगामी होने के लायक नहीं है। यह अभी भी प्रासंगिक है, मुझे लगता है। कृपया नए उपयोगकर्ताओं के लिए दयालु बनें।
ARK

-2

यदि आप स्कीमा से तालिका को ऑपरेशन से नीचे हटाना चाहते हैं -

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