Rails DB Migration - Comment supprimer une table?


507

J'ai ajouté une table dont je pensais que j'allais avoir besoin, mais maintenant je ne prévois plus de l'utiliser. Comment dois-je supprimer ce tableau?

J'ai déjà exécuté des migrations, donc la table est dans ma base de données. Je pense que je rails generate migrationdevrais être capable de gérer cela, mais je n'ai pas encore compris comment.

J'ai essayé:

rails generate migration drop_tablename

mais cela a juste généré une migration vide.

Quelle est la manière "officielle" de déposer une table dans Rails?


1
Puisqu'il rails generate migrationa des options en ligne de commande pour générer du code de migration pour créer des tables, ajouter ou modifier des colonnes, etc., ce serait bien s'il avait également une option pour supprimer une table - mais ce n'est pas le cas. Bien sûr, l'écriture de la uppartie est simple - appelez simplement drop_table- mais la downpartie, générant à nouveau la table, peut ne pas toujours être aussi simple, surtout si le schéma de la table en question a été modifié par des migrations après sa création initiale. Peut-être que quelqu'un devrait suggérer aux développeurs de Rails que l'ajout d'une telle option serait une bonne idée.
Teemu Leisti

3
@TeemuLeisti Que diriez-vous simplement de copier et coller la définition de table actuelle à partir de schema.rb? Je le fais de cette façon tout le temps ...
jasoares

1
@ João Soares: OK, je suppose que cela fonctionne. Cependant, ce serait bien si le processus pouvait être automatisé, de sorte que vous puissiez simplement donner une rakecommande de migration-création, avec le nom d'une table comme paramètre, qui produirait les fonctions upet nécessaires down.
Teemu Leisti

Réponses:


647

Vous ne pourrez pas toujours générer simplement la migration pour avoir déjà le code que vous souhaitez. Vous pouvez créer une migration vide, puis la remplir avec le code dont vous avez besoin.

Vous pouvez trouver des informations sur la façon d'accomplir différentes tâches dans une migration ici:

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

Plus précisément, vous pouvez voir comment supprimer une table en utilisant l'approche suivante:

drop_table :table_name

3
Cela a également fonctionné pour moi. Mais lors de migrations complètes (installation à partir de zéro), la table sera maintenant d'abord créée puis supprimée à nouveau. Est-il sûr de supprimer les migrations de création et de suppression sur la route?
berkes

2
Avez-vous une idée ici de savoir s'il vaut mieux supprimer des tables ou revenir à un schéma de base de données précédent?
william

3
Si vous avez terminé avec la table et que vous ne prévoyez plus de l'utiliser, je dirais simplement de la laisser tomber. Mieux vaut s'en débarrasser s'il n'est pas utilisé.
Pete

6
réponse de @BederAcostaBorges est plus explicite et précise
onerinas

2
Comment supprimer également toutes les clés étrangères? Il y a des colonnes dans d'autres tables pointant vers la table en cours de suppression.
Martin Konicek

352

Générez d'abord une migration vide avec le nom que vous souhaitez. Il est important de procéder de cette façon car cela crée la date appropriée.

rails generate migration DropProductsTable

Cela générera un fichier .rb dans / db / migrate / like 20111015185025_drop_products_table.rb

Modifiez maintenant ce fichier pour qu'il ressemble à ceci:

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

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

La seule chose que j'ai ajoutée était drop_table :productsetraise ActiveRecord::IrreversibleMigration .

Ensuite, courez rake db:migrateet ça laissera tomber la table pour vous.


14
Une migration vers le bas doit être utilisée pour recréer la table en cours de suppression.
fflyer05

1
Cette migration n'a jamais pu être annulée, même en cours de développement. Serait-il préférable de laisser la migration vers le bas vide?
mhriess

1
C'est la meilleure réponse + le commentaire de fflyer
Zack Shapiro

2
@mjnissim et fflyer05 sont corrects, afin d'éviter toute chose bizarre, vous devez recréer le tableau dans la méthode down.
Sebastialonso

5
Supprimer une table supprime toutes les données, si vous les recréez dans la downméthode, vous ne les récupérerez pas, ce n'est donc pas une restauration correcte. Il vaut mieux indiquer clairement que la migration est irréversible que de donner un faux sentiment qu'elle peut être récupérée.
vivi

314

Écrivez votre migration manuellement. Par exemple, courez rails g migration DropUsers.

En ce qui concerne le code de la migration, je vais juste citer la liste de contrôle de la migration des Rails de Maxwell Holder

MAUVAIS - en cours d'exécution rake db:migratepuis rake db:rollbackéchouera

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

BON - révèle l'intention que la migration ne devrait pas être réversible

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

  def down
    fail ActiveRecord::IrreversibleMigration
  end
end

MIEUX - est en fait réversible

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

Si vous coupez et collez dans le bloc de schema.rb, n'oubliez pas de rechercher également schema.rbdes clés étrangères. Ajoutez ensuite la définition de la clé étrangère au drop_tablebloc, par exemple:t.foreign_key "other_table"
Lencho Reyes

197

Bien que les réponses fournies ici fonctionnent correctement, je voulais quelque chose d'un peu plus «simple», je l'ai trouvé ici: lien Première entrée dans la console des rails:

$rails console

Tapez ensuite:

ActiveRecord::Migration.drop_table(:table_name)

Et c'est fait, ça a marché pour moi!


Le modèle est toujours là jusqu'à ce que vous rails destroy model User
couriez

2
Exécutez-le uniquement si vous souhaitez vous débarrasser de la table pour de bon. Rails ne sera pas au courant de cette baisse. La migration est interrompue après l'exécution de cette commande. Impossible de créer, de déposer ... ETC. ERREUR SQLite3 :: SQLException: aucune table de ce type: cumul: DROP TABLE "Sometable"
zee

36

Vous devez créer un nouveau fichier de migration à l'aide de la commande suivante

rails generate migration drop_table_xyz

et écrivez le code drop_table dans le fichier de migration nouvellement généré (db / migration / xxxxxxx_drop_table_xyz) comme

drop_table :tablename

Ou si vous vouliez déposer une table sans migration, ouvrez simplement la console des rails en

$ rails c

et exécuter la commande suivante

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

ou vous pouvez utiliser une commande plus simplifiée

ActiveRecord::Migration.drop_table(:table_name)

21
  1. migration des rails g drop_users
  2. modifier la migration
    class DropUsers < ActiveRecord::Migration
      def change
        drop_table :users do |t|
          t.string :name
          t.timestamps
        end
      end
    end
  1. rake db: migrer

13

Je pense que pour être complètement "officiel", vous devez créer une nouvelle migration et mettre drop_table dans self.up. La méthode self.down doit alors contenir tout le code pour recréer la table dans son intégralité. Vraisemblablement, ce code pourrait simplement être extrait de schema.rb au moment où vous créez la migration.

Cela semble un peu étrange, de mettre du code pour créer une table dont vous savez que vous n'aurez plus besoin, mais cela garderait tout le code de migration complet et "officiel", non?

Je viens de le faire pour une table que je devais laisser tomber, mais honnêtement, je n'ai pas testé le "down" et je ne sais pas pourquoi je le ferais.


1
Étrange mais on dirait que je vais devoir faire ça aussi.
digitalWestie

7
Ou vous pouvez simplement utiliser: raise ActiveRecord::IrreversibleMigrationdans la méthode self.down, de sorte que vous vous donniez au moins une erreur / notification si vous essayez de revenir en arrière.
Steph Rose

1
Je testerais le bas parce que sinon j'introduis du code non testé dans mon projet. Comment puis-je réutiliser la méthode up de la migration d'origine? J'ai essayé CreateMyTable.upet ActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, X)où X est la migration qui a initialement créé la table, mais aucun ne fonctionne - dans les deux approches, AR vérifie d'abord si la migration a déjà été appliquée, et l'ignore silencieusement si c'est le cas. `
Isaac Betesh

12

vous pouvez simplement déposer une table depuis la console des rails. ouvrez d'abord la console

$ rails c

puis collez cette commande dans la console

ActiveRecord::Migration.drop_table(:table_name)

remplacez table_name par la table que vous souhaitez supprimer.

vous pouvez également déposer la table directement depuis le terminal. entrez simplement dans le répertoire racine de votre application et exécutez cette commande

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

10

La manière simple et officielle serait la suivante:

  rails g migration drop_tablename

Maintenant, allez dans votre db / migrate et recherchez votre fichier qui contient le drop_tablename comme nom de fichier et modifiez-le en conséquence.

    def change
      drop_table :table_name
    end

Ensuite, vous devez exécuter

    rake db:migrate 

sur votre console.


9

Vous pouvez annuler une migration telle qu'elle est dans le guide:

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

Générez une migration:

rails generate migration revert_create_tablename

Écrivez la migration:

require_relative '20121212123456_create_tablename'

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

De cette façon, vous pouvez également annuler et utiliser pour annuler toute migration


8

Alternative à la levée d'exception ou à la tentative de recréer une table désormais vide - tout en permettant la restauration, la restauration, etc. -

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

8

Je n'ai pas été en mesure de le faire fonctionner avec le script de migration, j'ai donc continué avec cette solution. Entrez dans la console des rails à l'aide du terminal:

rails c

Type

ActiveRecord::Migration.drop_table(:tablename)

Cela fonctionne bien pour moi. Cela supprimera le tableau précédent. N'oubliez pas de courir

rails db:migrate

7

Ouvrez votre console de rails

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

4

ActiveRecord::Base.connection.drop_table :table_name


2

Je devais supprimer nos scripts de migration ainsi que les tables elles-mêmes ...

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

à partir de la fenêtre du terminal:

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

ou

$ rails runner "Util::Table.clobber_all"

1

la meilleure façon de faire est

rails g migration Drop_table_Users

puis procédez comme suit

rake db:migrate

1

Courir

rake db:migrate:down VERSION=<version>

<version>est le numéro de version de votre fichier de migration que vous souhaitez rétablir.

Exemple:-

rake db:migrate:down VERSION=3846656238

1

si quelqu'un cherche comment le faire en SQL.

type à rails dbconsolepartir du terminal

Entrer le mot de passe

Dans la console, faites

USE db_name;

DROP TABLE table_name;

exit

N'oubliez pas de supprimer le fichier de migration et la structure de la table du schéma


Vous pouvez également l'ouvrir en tapant simplementrails db
ARK

0

si vous voulez supprimer une table spécifique, vous pouvez le faire

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

sinon, si vous voulez supprimer toute votre base de données, vous pouvez le faire

$rails db:drop

-1

Drop Table / Migration

exécuter: - $ rails générer la migration DropTablename

exp: - $ rails génèrent la migration DropProducts


-1

Exécutez cette commande: -

rails g migration drop_table_name

puis:

rake db:migrate

ou si vous utilisez la base de données MySql, alors:

  1. se connecter avec la base de données
  2. show databases;
  3. show tables;
  4. drop table_name;

3
Cette réponse ajoute-t-elle quelque chose à la réponse existante et acceptée? Sinon, il n'est pas nécessaire de poster ceci.
Tom Lord

1
cela crée une migration vide dans les rails 4.2, comme déjà indiqué dans la question elle-même.
bert bruynooghe

C'est exactement ce que l'OP a essayé à l'origine ... cette réponse devrait être supprimée
webaholik

L'ajout d'une réponse simple ne mérite pas d'être déclassé. C'est toujours pertinent, je suppose. Soyez gentil avec les nouveaux utilisateurs s'il vous plaît.
ARK

-2

Si vous souhaitez supprimer la table du schéma, effectuez l'opération ci-dessous -

rails db:rollback
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.