Rails DB Migration – Come far cadere una tabella?

Ho aggiunto un tavolo che pensavo avessi bisogno, ma ora non ho più intenzione di usarlo. Come dovrei rimuovere quel tavolo?

Ho già eseguito le migrazioni, quindi la tabella è nel mio database. Immagino che i rails generate migration dovrebbero essere in grado di gestirli, ma non ho ancora capito come.

Ho provato:
rails generate migration drop_tablename ,
ma quello ha generato appena una migrazione vuota.

Qual è il modo “ufficiale” per far cadere un tavolo in Rails?

Non sarai sempre in grado di generare semplicemente la migrazione per avere già il codice che desideri. È ansible creare una migrazione vuota e quindi popolarla con il codice necessario.

Qui puoi trovare informazioni su come eseguire diverse attività in una migrazione:

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

Più specificamente, puoi vedere come rilasciare una tabella usando il seguente approccio:

 drop_table :table_name 

Per prima cosa genera una migrazione vuota con qualsiasi nome desideri. È importante farlo in questo modo poiché crea la data appropriata.

 rails generate migration DropProductsTable 

Questo genererà un file .rb in / db / migrate / like 20111015185025_drop_products_table.rb

Ora modifica quel file per assomigliare a questo:

 class DropProductsTable < ActiveRecord::Migration def up drop_table :products end def down raise ActiveRecord::IrreversibleMigration end end 

L'unica cosa che ho aggiunto era drop_table :products e raise ActiveRecord::IrreversibleMigration .

Quindi esegui rake db:migrate e lascerà cadere la tabella per te.

Scrivi la tua migrazione manualmente. Es. Run rails g migration DropUsers .

Per quanto riguarda il codice della migrazione, cito solo la lista di controllo sulla migrazione post Rails di Maxwell Holder

BAD – running rake db:migrate e quindi rake db:rollback fallirà

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

BUONO - rivela l'intento che la migrazione non dovrebbe essere reversibile

 class DropUsers < ActiveRecord::Migration def up drop_table :users end def down fail ActiveRecord::IrreversibleMigration end end 

MEGLIO - è in realtà reversibile

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

Sebbene le risposte fornite qui funzionino correttamente, volevo qualcosa di un po ‘più “diretto”, l’ho trovato qui: link First enter rails console:

 $rails console 

Quindi digita semplicemente:

 ActiveRecord::Migration.drop_table(:table_name) 

E fatto, ha funzionato per me!

È necessario creare un nuovo file di migrazione utilizzando il seguente comando

 rails generate migration drop_table_xyz 

e scrivi il codice drop_table nel file di migrazione appena generato (db / migration / xxxxxxx_drop_table_xyz) come

 drop_table :tablename 

O se volessi abbandonare la tabella senza migrazione, apri semplicemente la console di rotaie

 $ rails c 

ed eseguire il seguente comando

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

oppure puoi usare un comando più semplice

 ActiveRecord::Migration.drop_table(:table_name) 
  1. rails g migration drop_users
  2. modifica la migrazione
  class DropUsers < ActiveRecord::Migration def change drop_table :users do |t| t.string :name t.timestamps end end end 
  1. rake db: migrate

Penso che, per essere completamente “ufficiale”, avresti bisogno di creare una nuova migrazione e mettere drop_table in self.up. Il metodo self.down dovrebbe quindi contenere tutto il codice per ricreare completamente la tabella. Presumibilmente il codice potrebbe essere preso da schema.rb al momento della creazione della migrazione.

Sembra un po ‘strano, mettere in codice per creare un tavolo sai che non avrai più bisogno, ma questo manterrà tutto il codice di migrazione completo e “ufficiale”, giusto?

Ho appena fatto questo per un tavolo che dovevo lasciare, ma sinceramente non ho provato il “down” e non sono sicuro del perché lo avrei fatto.

puoi semplicemente rilasciare un tavolo dalla console di rails. per prima cosa apri la console

 $ rails c 

quindi incollare questo comando nella console

 ActiveRecord::Migration.drop_table(:table_name) 

sostituire table_name con la tabella che si desidera eliminare.

puoi anche rilasciare la tabella direttamente dal terminale. basta inserire nella directory radice della propria applicazione ed eseguire questo comando

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

Apri la console delle tue guide

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

Puoi eseguire il rollback di una migrazione così come è nella guida:

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

Genera una migrazione:

 rails generate migration revert_create_tablename 

Scrivi la migrazione:

 require_relative '20121212123456_create_tablename' class RevertCreateTablename < ActiveRecord::Migration[5.0] def change revert CreateTablename end end 

In questo modo puoi anche eseguire il rollback e puoi utilizzare per annullare qualsiasi migrazione

Il modo semplice e ufficiale sarebbe questo:

  rails g migration drop_tablename 

Ora vai al tuo db / migrate e cerca il tuo file che contiene il drop_tablename come nome del file e modificalo in questo.

  def change drop_table :table_name end 

Allora devi correre

  rake db:migrate 

sulla tua console.

ActiveRecord::Base.connection.drop_table :table_name

Avevo bisogno di cancellare i nostri script di migrazione insieme alle tabelle stesse …

 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 

dalla finestra del terminale:

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

o

 $ rails runner "Util::Table.clobber_all" 

Alternativa all’eccezione o al tentativo di ricreare una tabella ora vuota, pur continuando a consentire il rollback della migrazione, la ripetizione, ecc.

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

Esegui questo comando: –

 rails g migration drop_table_name 

poi:

 rake db:migrate 

o se stai usando il database MySql allora:

  1. accedi con il database
  2. show databases;
  3. show tables;
  4. drop table_name;

il modo migliore che puoi fare è

 rails g migration Drop_table_Users 

quindi fai quanto segue

 rake db:migrate 

Correre

 rake db:migrate:down VERSION= 

Dove è il numero di versione del file di migrazione che desideri ripristinare.

Esempio:-

 rake db:migrate:down VERSION=3846656238 

se vuoi lasciare un tavolo specifico puoi farlo

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

altrimenti se vuoi eliminare tutto il tuo database puoi farlo

 $rails db:drop 

Drop Table / Migrazione

eseguire: – $ rails generare DropTablename di migrazione

exp: – $ rails genera la migrazione DropProducts