Migrazione di Rails DB - Come eliminare una tabella?


507

Ho aggiunto un tavolo di cui pensavo che avrei avuto bisogno, ma ora non ho più intenzione di usarlo. Come devo rimuovere quella tabella?

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

Ho provato:

rails generate migration drop_tablename

ma questo ha appena generato una migrazione vuota.

Qual è il modo "ufficiale" di eliminare un tavolo in Rails?


1
Dal momento che rails generate migrationha opzioni da riga di comando per la generazione di codice di migrazione per la creazione di tabelle, l'aggiunta o la modifica di colonne, ecc., Sarebbe bello se avesse anche un'opzione per eliminare una tabella, ma non è così. Certo, scrivere la upparte è semplice - basta chiamare drop_table- ma la downparte, che genera di nuovo la tabella, potrebbe non essere sempre così semplice, specialmente se lo schema della tabella in questione è stato modificato dalle migrazioni dopo la sua creazione iniziale. Forse qualcuno dovrebbe suggerire agli sviluppatori di Rails che aggiungere una tale opzione sarebbe una buona idea.
Teemu Leisti,

3
@TeemuLeisti Che ne dici di copiare e incollare l'attuale definizione della tabella da schema.rb? Lo faccio sempre così ...
jasoares,

1
@ João Soares: OK, immagino che funzioni. Tuttavia, sarebbe bello se il processo potesse essere automatizzato, in modo da poter semplicemente dare un rakecomando di creazione della migrazione, con il nome di una tabella come parametro, che producesse il necessario upe le downfunzioni.
Teemu Leisti,

Risposte:


647

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

Puoi trovare informazioni su come eseguire diverse attività in una migrazione qui:

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

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

drop_table :table_name

3
Questo ha funzionato anche per me. Ma nelle migrazioni complete (installazione da zero) la tabella verrà ora creata per prima e successivamente rimossa. È sicuro rimuovere la creazione e eliminare le migrazioni lungo la strada?
Berkes,

2
Qualche visione qui se è meglio eliminare le tabelle o ripristinare uno schema di database precedente?
william racconta

3
Se hai finito con il tavolo e non prevedi più di usarlo, direi semplicemente di lasciarlo. Meglio liberarsene se non viene usato.
Pete,

6
la risposta di @BederAcostaBorges è più chiara e precisa
onerinas

2
Come rimuovere anche tutte le chiavi esterne? Ci sono colonne in altre tabelle che indicano che la tabella viene eliminata.
Martin Konicek,

352

Innanzitutto 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 in questo modo:

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

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

L'unica cosa che ho aggiunto è stata drop_table :productse raise ActiveRecord::IrreversibleMigration.

Quindi esegui rake db:migratee lascerà cadere il tavolo per te.


14
Una migrazione verso il basso dovrebbe essere utilizzata per ricreare la tabella da eliminare.
fflyer05,

1
Questa migrazione non potrebbe mai essere annullata, nemmeno in fase di sviluppo. Sarebbe meglio lasciare vuota la migrazione verso il basso?
mhriess,

1
Questa è la risposta migliore + il commento di Fflyer
Zack Shapiro,

2
@mjnissim e fflyer05 sono corretti, per evitare qualsiasi cosa strana dovresti ricreare la tabella nel metodo down.
Sebastialonso,

5
Se si elimina una tabella, tutti i dati vengono eliminati, se lo si ricrea nel downmetodo non lo si ripristinerà, quindi in realtà non è un rollback corretto. È meglio indicare chiaramente che la migrazione è irreversibile piuttosto che dare un falso senso dal quale può essere recuperata.
Vivi,

314

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

Per quanto riguarda il codice della migrazione, citerò l' elenco di controllo per la migrazione dei post di Maxwell Holder

MALE - in esecuzione rake db:migratee quindi rake db:rollbackfallirà

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

BUONO - rivela l'intenzione 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

Se stai tagliando e incollando nel blocco schema.rb, non dimenticare di cercare anche schema.rbchiavi esterne. Quindi aggiungi la definizione di chiave esterna al drop_tableblocco, ad esempio:t.foreign_key "other_table"
Lencho Reyes

197

Mentre le risposte fornite qui funzionano correttamente, volevo qualcosa di un po 'più "semplice", l'ho trovato qui: link Prima di accedere alla console di rails:

$rails console

Quindi digita:

ActiveRecord::Migration.drop_table(:table_name)

E fatto, ha funzionato per me!


Il modello è ancora lì fino a quando non corrirails destroy model User
gm2008

2
Esegui questo solo se vuoi sbarazzarti del tavolo per sempre. Rails non sarà a conoscenza di questo calo. La migrazione viene interrotta dopo aver eseguito questo comando. Impossibile CREARE, GOCCARE ... ECC. ERRORE SQLite3 :: SQLException: nessuna tabella simile: ratei: DROP TABLE "sometable"
zee

36

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

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

Oppure, se si desidera eliminare la tabella senza migrazione, è sufficiente aprire la console di Rails

$ rails c

ed esegui il seguente comando

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

oppure puoi usare un comando più semplificato

ActiveRecord::Migration.drop_table(:table_name)

21
  1. binari g migrazione 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: migrare

13

Penso che, per essere completamente "ufficiale", dovresti creare una nuova migrazione e inserire drop_table in self.up. Il metodo self.down dovrebbe quindi contenere tutto il codice per ricreare la tabella per intero. Presumibilmente quel codice potrebbe essere semplicemente preso da schema.rb al momento della creazione della migrazione.

Sembra un po 'strano inserire il codice per creare una tabella che sai che non ti servirà più, ma ciò manterrebbe tutto il codice di migrazione completo e "ufficiale", giusto?

L'ho fatto solo per un tavolo che dovevo abbandonare, ma onestamente non ho testato il "down" e non sono sicuro del perché.


1
Strano ma sembra che dovrò farlo anche io.
digitalWestie,

7
Oppure puoi semplicemente usare: raise ActiveRecord::IrreversibleMigrationcon il metodo self.down, quindi in LEAST ti dai un errore / avviso se provi a eseguire il rollback.
Steph Rose

1
Vorrei testare il down solo perché altrimenti sto introducendo codice non testato nel mio progetto. Come posso riutilizzare il metodo up della migrazione originale? Ho provato CreateMyTable.upe ActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, X)dove X è la migrazione che ha originariamente creato la tabella, ma nessuna delle due funziona: in entrambi gli approcci, AR controlla innanzitutto se la migrazione è già stata applicata e la salta silenziosamente se ha. `
Isaac Betesh,

12

puoi semplicemente eliminare un tavolo dalla console di rotaie. prima apri la console

$ rails c

quindi incolla questo comando nella console

ActiveRecord::Migration.drop_table(:table_name)

sostituire table_name con la tabella che si desidera eliminare.

puoi anche eliminare la tabella direttamente dal terminale. basta inserire nella directory principale dell'applicazione ed eseguire questo comando

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

10

Il modo semplice e ufficiale sarebbe questo:

  rails g migration drop_tablename

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

    def change
      drop_table :table_name
    end

Quindi devi correre

    rake db:migrate 

sulla tua console.


9

È possibile ripristinare una migrazione 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 è anche possibile eseguire il rollback e utilizzare per ripristinare qualsiasi migrazione


8

Alternativa alla raccolta di eccezioni o al tentativo di ricreare una tabella ora vuota - pur consentendo il rollback della migrazione, la ripetizione ecc. -

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

8

Non sono riuscito a farlo funzionare con lo script di migrazione, quindi sono andato avanti con questa soluzione. Inserisci la console di rotaie usando il terminale:

rails c

genere

ActiveRecord::Migration.drop_table(:tablename)

Funziona bene per me. Ciò rimuoverà la tabella precedente. Non dimenticare di correre

rails db:migrate

7

Apri la tua console di binari

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

4

ActiveRecord::Base.connection.drop_table :table_name


2

Avevo bisogno di eliminare 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 terminale:

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

o

$ rails runner "Util::Table.clobber_all"

1

il modo migliore che puoi fare è

rails g migration Drop_table_Users

quindi procedi come segue

rake db:migrate

1

Correre

rake db:migrate:down VERSION=<version>

Dove <version> il numero di versione del file di migrazione che si desidera ripristinare.

Esempio:-

rake db:migrate:down VERSION=3846656238

1

se qualcuno sta cercando come farlo in SQL.

digitare rails dbconsoledal terminale

inserire la password

In console

USE db_name;

DROP TABLE table_name;

exit

Non dimenticare di rimuovere il file di migrazione e la struttura della tabella dallo schema


Puoi anche aprirlo digitando solorails db
ARK il

0

se vuoi eliminare una tabella specifica puoi farlo

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

in caso contrario, se si desidera eliminare tutto il database, è possibile farlo

$rails db:drop

-1

Elimina tabella / migrazione

eseguire: - $ rails generano la migrazione DropTablename

exp: - $ rails generano DropProducts di migrazione


-1

Esegui questo comando: -

rails g migration drop_table_name

poi:

rake db:migrate

o se si utilizza il database MySql quindi:

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

3
Questa risposta aggiunge qualcosa alla risposta esistente accettata? In caso contrario, non è necessario pubblicare questo.
Tom Lord,

1
questo crea una migrazione vuota nelle rotaie 4.2, come già affermato nella domanda stessa.
bert bruynooghe,

Questo è ESATTAMENTE ciò che originariamente l'OP ha provato ... questa risposta dovrebbe essere rimossa
webaholik,

L'aggiunta di una risposta semplice non merita il downgrade. È ancora rilevante, immagino. Sii gentile con i nuovi utenti, per favore.
ARK,

-2

Se si desidera eliminare la tabella dallo schema, eseguire l'operazione di seguito:

rails db:rollback
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.