ruby-on-rails - generation - rails rollback migration




Rails DB Migration-Comment faire tomber une table? (13)

Ce n'est pas la meilleure ou la bonne solution à ce jour, vous pouvez le faire au début du stade de développement ...

Développement ENV. Vous pouvez supprimer le fichier migré de (db/migrate/12345.....name_of_migrated_file) .

rake db:drop
rake db:create #This is unnecessary if using SQlite, but useful sometimes.
rake db:migrate

#or
rake db:migrate:reset

Si vous avez un fichier de graines, créez simplement une nouvelle tâche de rake pour le développement.

#file: /lib/taks/db.rake
namespace :db do
  desc 'Drop, create, migrate then seed the development database'
  task database: [ 'db:drop', 'db:create', 'db:migrate', 'db:seed' ] do
    puts 'Datebase Remigrated.'
  end
end

# And you can run it. It will drop, create, migrate and seed for you.
rake db:database

J'ai ajouté une table dont je pensais avoir besoin, mais je n'ai plus l'intention de l'utiliser. Comment devrais-je retirer cette table?

J'ai déjà exécuté des migrations, donc la table est dans ma base de données. Je pense que les rails generate migration devraient être capables 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. rails g migration 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

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

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


Commencez par générer une migration vide avec le nom que vous souhaitez. Il est important de le faire de cette façon, car il 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 ressembler à 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é était drop_table :products et raise ActiveRecord::IrreversibleMigration .

Ensuite, lancez rake db:migrate et il va laisser tomber la table pour vous.


Ecrivez votre migration manuellement. Ex: run rails g migration DropUsers .

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

BAD - exécution de rake db:migrate et 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 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

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

à partir de la fenêtre du terminal:

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

ou

$ rails runner "Util::Table.clobber_all"

La façon simple et officielle serait la suivante:

  rails g migration drop_tablename

Maintenant, allez dans votre fichier db / migrate et recherchez votre fichier qui contient le nom de fichier drop_table comme nom de fichier et modifiez-le.

    def change
      drop_table :table_name
    end

Ensuite, vous devez courir

    rake db:migrate 

sur votre console.


Ouvrez la console des rails

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

Vous ne serez pas toujours capable de générer simplement la migration pour avoir déjà le code que vous voulez. 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

Vous pouvez annuler une migration comme 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


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 table_name par la table que vous voulez supprimer.

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

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

ActiveRecord::Base.connection.drop_table :table_name


Exécutez cette commande: -

$ rails g migration drop_table_name

puis:

$ rake db: migrer

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

  1. connexion avec base de données
  2. afficher des bases de données;
  3. afficher des tableaux;
  4. drop nom_table;




rake