web-dev-qa-db-fra.com

Rails DB Migration - Comment supprimer une table?

J'ai ajouté un tableau dont je pensais avoir besoin, mais je ne prévois plus de l'utiliser. Comment dois-je enlever cette table?

J'ai déjà effectué des migrations, donc la table est dans ma base de données. Je pense que Rails generate migration devrait être capable de gérer ça, mais je n'ai pas encore compris comment.

J'ai essayé: 

Rails generate migration drop_tablename

mais cela vient de générer une migration vide.

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

451
Jason Whitehorn

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

Vous pouvez trouver des informations sur la manière d'effectuer différentes tâches dans une migration ici:

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

Plus spécifiquement, vous pouvez voir comment supprimer une table en utilisant l'approche suivante:

drop_table :table_name
597
Pete

Commencez par générer une migration vide avec le nom de votre choix. Il est important de le faire 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

Maintenant, éditez 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 :products et raise ActiveRecord::IrreversibleMigration.

Ensuite, lancez rake db:migrate et il supprimera la table pour vous.

330
Brandon O'Rourke

Ecrivez votre migration manuellement. Par exemple. lancez Rails g migration DropUsers.

En ce qui concerne le code de la migration, je vais simplement citer le message de Maxwell Holder Rails Migration Checklist

BAD - l'exécution de rake db:migrate et ensuite de rake db:rollback échouera

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

BON - révèle 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 réellement 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
273
Beder Acosta Borges

Bien que les réponses fournies ici fonctionnent correctement, je voulais quelque chose de plus simple, mais je l’ai trouvé ici: link Commencez par entrer dans la console Rails:

$Rails console

Puis tapez simplement:

ActiveRecord::Migration.drop_table(:table_name)

Et fait, a travaillé pour moi!

183
lllllll

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

Rails generate migration drop_table_xyz

et écrivez du 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 souhaitez supprimer une table sans migration, ouvrez simplement la console 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)
35
Shahzad Tariq
  1. Rails g migration drop_users
  2. éditer 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
21
Aashish Saini

Je pense que pour être complètement "officiel", il vous faudrait 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é. On peut supposer que ce code pourrait simplement être extrait de schema.rb au moment de la création de la migration.

Cela semble un peu étrange, de mettre dans le 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 faire cela pour une table que je devais laisser tomber, mais honnêtement, je n'ai pas testé le "duvet" et je ne savais pas pourquoi je le ferais.

13
Francis Potter

vous pouvez simplement déposer une table de la console Rails . d'abord ouvrir la console

$ Rails c

puis collez cette commande dans la console

ActiveRecord::Migration.drop_table(:table_name)

remplacez nom_table par la table que vous souhaitez supprimer.

vous pouvez également déposer la table directement depuis le terminal. il suffit d'entrer dans le répertoire racine de votre application et d'exécuter cette commande

$ Rails runner "Util::Table.clobber 'table_name'"
11
Farzpal Singh

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érer une migration:

Rails generate migration revert_create_tablename

Ecrire 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 revenir en arrière et utiliser pour annuler toute migration.

7
Matheus Silva

Ouvrez votre console Rails

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

La manière simple et officielle serait la suivante:

  Rails g migration drop_tablename

Maintenant, allez dans votre base de données/migrate et recherchez votre fichier qui contient le nom de fichier drop_tablename comme nom de fichier, puis modifiez-le.

    def change
      drop_table :table_name
    end

Ensuite, vous devez courir

    rake db:migrate 

sur votre console.

6
Mahesh Mesta

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

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

ActiveRecord::Base.connection.drop_table :table_name

4
nhegroj

Je ne pouvais pas le faire fonctionner avec le script de migration, alors je suis allé de l'avant avec cette solution. Entrez la console Rails en utilisant le terminal:

Rails c

Type

ActiveRecord::Migration.drop_table(:tablename)

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

Rails db:migrate
2
Srikanth V

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;
2
Nitin Rakesh

J'avais besoin de supprimer nos scripts de migration avec 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

depuis la fenêtre du terminal, lancer:

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

ou

$ Rails runner "Util::Table.clobber_all"
2
Aaron Henderson

la meilleure façon de faire est 

Rails g migration Drop_table_Users

puis faites ce qui suit

rake db:migrate
1
Anoob K Bava

Courir

rake db:migrate:down VERSION=<version>

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

Exemple:-

rake db:migrate:down VERSION=3846656238
1
Rankit Ranjan

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

Rails db:rollback
0
iamnair

si quelqu'un cherche comment le faire en SQL.

tapez Rails dbconsole depuis le terminal

entrer le mot de passe

En console faire

USE db_name;

DROP TABLE table_name;

exit

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

0
Shan

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
0
Nicollas Matheus