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?

Jason Whitehorn
la source
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
Pete
la source
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.

Brandon O'Rourke
la source
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
Beder Acosta Borges
la source
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!

lllllll
la source
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)
Shahzad Tariq
la source
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
Aashish Saini
la source
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.

Francis Potter
la source
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'"
Farzpal Singh
la source
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.

Mahesh Mesta
la source
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

Matheus Silva
la source
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
aqwan
la source
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
Srikanth V
la source
7

Ouvrez votre console de rails

ActiveRecord::Base.connection.execute("drop table table_name")
manish nautiyal
la source
4

ActiveRecord::Base.connection.drop_table :table_name

nhegroj
la source
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"
Aaron Henderson
la source
1

la meilleure façon de faire est

rails g migration Drop_table_Users

puis procédez comme suit

rake db:migrate
Anoob K Bava
la source
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
Rankit Ranjan
la source
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

Shan
la source
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
Nicollas
la source
-1

Drop Table / Migration

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

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

Pankaj Dhote
la source
-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;
Nitin Rakesh
la source
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
iamnair
la source