Rails DB Migration - ¿Cómo soltar una tabla?

507

Agregué una tabla que pensé que iba a necesitar, pero ahora ya no planeo usarla. ¿Cómo debo eliminar esa tabla?

Ya he realizado migraciones, por lo que la tabla está en mi base de datos. Supongo que rails generate migrationdebería ser capaz de manejar esto, pero aún no he descubierto cómo.

He intentado:

rails generate migration drop_tablename

pero eso solo generó una migración vacía.

¿Cuál es la forma "oficial" de colocar una tabla en Rails?

Jason Whitehorn
fuente
1
Dado que rails generate migrationtiene opciones de línea de comandos para generar código de migración para crear tablas, agregar o cambiar columnas, etc., sería bueno si también tuviera una opción para soltar una tabla, pero no la tiene. Claro, escribir la upparte es simple, solo llame drop_table, pero la downparte, que genera la tabla nuevamente, puede no ser siempre tan simple, especialmente si las migraciones han cambiado el esquema de la tabla en cuestión después de su creación inicial. Tal vez alguien debería sugerir a los desarrolladores de Rails que agregar esa opción sería una buena idea.
Teemu Leisti
3
@TeemuLeisti ¿Qué tal si solo copia y pega la definición de tabla actual de schema.rb? Lo hago así todo el tiempo ...
jasoares
1
@ João Soares: OK, supongo que eso funciona. Sin embargo, sería bueno si el proceso pudiera automatizarse, de modo que pudiera simplemente dar un rakecomando de creación de migración, con el nombre de una tabla como parámetro, que produciría las funciones upy downfunciones necesarias .
Teemu Leisti

Respuestas:

647

No siempre podrá generar simplemente la migración para tener el código que desea. Puede crear una migración vacía y luego completarla con el código que necesita.

Puede encontrar información sobre cómo realizar diferentes tareas en una migración aquí:

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

Más específicamente, puede ver cómo colocar una tabla utilizando el siguiente enfoque:

drop_table :table_name
Pete
fuente
3
Esto también funcionó para mí. Pero en las migraciones completas (instalación desde cero), la tabla ahora se creará primero y luego se eliminará nuevamente. ¿Es seguro eliminar las migraciones de crear y soltar en el futuro?
Berkes
2
¿Alguna opinión aquí sobre si es mejor descartar tablas o volver a un esquema de base de datos anterior?
William le dice
3
Si ha terminado con la tabla y no planea usarla más, yo diría que simplemente la deje caer. Es mejor deshacerse de él si no se está utilizando.
Pete
66
la respuesta de @BederAcostaBorges se explica por sí misma y es más precisa
onerinas
2
¿Cómo eliminar también todas las claves foráneas? Hay columnas en otras tablas que apuntan a la tabla que se descarta.
Martin Konicek
352

Primero genere una migración vacía con cualquier nombre que desee. Es importante hacerlo de esta manera, ya que crea la fecha adecuada.

rails generate migration DropProductsTable

Esto generará un archivo .rb en / db / migrate / like 20111015185025_drop_products_table.rb

Ahora edite ese archivo para que se vea así:

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

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

Lo único que agregué fue drop_table :productsy raise ActiveRecord::IrreversibleMigration.

Luego corre rake db:migratey te dejará caer la mesa.

Brandon O'Rourke
fuente
14
Se debe usar una migración hacia abajo para recrear la tabla que se descarta.
fflyer05
1
Esta migración nunca podría revertirse, incluso en desarrollo. ¿Sería mejor dejar en blanco la migración hacia abajo?
mhriess
1
Esta es la mejor respuesta + comentario de fflyer
Zack Shapiro
2
@mjnissim y fflyer05 son correctos, para evitar cualquier cosa extraña, debe recrear la tabla en el método down.
Sebastialonso el
55
Al soltar una tabla, se eliminan todos los datos; si la vuelve a crear en el downmétodo, no la recuperará, por lo que en realidad no es una reversión adecuada. Es mejor indicar claramente que la migración es irreversible que dar una falsa sensación de que se puede recuperar.
vivi
314

Escribe tu migración manualmente. Ej rails g migration DropUsers. Correr .

En cuanto al código de la migración sólo voy a citar el post de Maxwell titular Carriles Migración Lista de verificación

MALO - corriendo rake db:migratey luego rake db:rollbackfallará

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

BIEN: revela la intención de que la migración no sea reversible

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

  def down
    fail ActiveRecord::IrreversibleMigration
  end
end

MEJOR - es realmente reversible

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
fuente
Si está cortando y pegando en el bloque schema.rb, no olvide buscar también schema.rbclaves foráneas. Luego agregue la definición de clave externa al drop_tablebloque, por ejemplo:t.foreign_key "other_table"
Lencho Reyes
197

Si bien las respuestas proporcionadas aquí funcionan correctamente, quería algo un poco más 'directo', lo encontré aquí: enlace Primero ingrese a la consola de rails:

$rails console

Luego simplemente escriba:

ActiveRecord::Migration.drop_table(:table_name)

Y listo, funcionó para mí!

lllllll
fuente
El modelo sigue ahí hasta que corrasrails destroy model User
gm2008
2
Solo ejecuta esto si quieres deshacerte de la mesa para siempre. Los rieles no serán conscientes de esta caída. La migración se interrumpe después de ejecutar este comando. No se puede CREAR, COLOCAR ... ETC. ERROR SQLite3 :: SQLException: no existe tal tabla: acumulaciones: DROP TABLE "sometable"
zee
36

Debe crear un nuevo archivo de migración con el siguiente comando

rails generate migration drop_table_xyz

y escriba el código drop_table en el archivo de migración recién generado (db / migration / xxxxxxx_drop_table_xyz) como

drop_table :tablename

O, si desea abandonar la tabla sin migración, simplemente abra la consola de rails

$ rails c

y ejecuta el siguiente comando

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

o puedes usar un comando más simplificado

ActiveRecord::Migration.drop_table(:table_name)
Shahzad Tariq
fuente
21
  1. rieles g migración drop_users
  2. editar la migración
    class DropUsers < ActiveRecord::Migration
      def change
        drop_table :users do |t|
          t.string :name
          t.timestamps
        end
      end
    end
  1. rastrillo db: migrar
Aashish Saini
fuente
13

Creo que, para ser completamente "oficial", necesitaría crear una nueva migración y colocar drop_table en self.up. El método self.down debería contener todo el código para recrear la tabla en su totalidad. Presumiblemente, ese código podría tomarse de schema.rb al momento de crear la migración.

Parece un poco extraño poner un código para crear una tabla que sabes que ya no necesitarás, pero eso mantendría todo el código de migración completo y "oficial", ¿verdad?

Simplemente hice esto para una mesa que necesitaba dejar, pero honestamente no probé el "down" y no estaba seguro de por qué lo haría.

Francis Potter
fuente
1
Es extraño, pero parece que voy a tener que hacer esto también.
digitalWestie
77
O simplemente puede usar: raise ActiveRecord::IrreversibleMigrationen el método self.down, por lo que, al MENOS, se dará un error / aviso si alguna vez intenta retroceder.
Steph Rose
1
Probaría el down solo porque de lo contrario estoy introduciendo código no probado en mi proyecto. ¿Cómo puedo reutilizar el método de migración original? He intentado CreateMyTable.upy ActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, X)donde X es la migración que originalmente creó la tabla, pero ninguna de las dos funciona: en ambos enfoques, AR primero comprueba si la migración ya se ha aplicado y la omite en silencio si es así. `
Isaac Betesh
12

simplemente puede soltar una mesa desde la consola de rieles. primero abre la consola

$ rails c

luego pegue este comando en la consola

ActiveRecord::Migration.drop_table(:table_name)

reemplace table_name con la tabla que desea eliminar.

También puede colocar la tabla directamente desde la terminal. simplemente ingrese en el directorio raíz de su aplicación y ejecute este comando

$ rails runner "Util::Table.clobber 'table_name'"
Farzpal Singh
fuente
10

La forma simple y oficial sería esta:

  rails g migration drop_tablename

Ahora vaya a su db / migrate y busque su archivo que contiene drop_tablename como nombre de archivo y edítelo en este.

    def change
      drop_table :table_name
    end

Entonces necesitas correr

    rake db:migrate 

en tu consola

Mahesh Mesta
fuente
9

Puede revertir una migración tal como está en la guía:

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

Generar una migración:

rails generate migration revert_create_tablename

Escribe la migración:

require_relative '20121212123456_create_tablename'

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

De esta manera, también puede revertir y usar para revertir cualquier migración

Matheus Silva
fuente
8

Alternativa a generar una excepción o intentar recrear una tabla ahora vacía, al tiempo que permite la reversión de la migración, rehacer, etc.

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

No pude hacerlo funcionar con el script de migración, así que seguí adelante con esta solución. Ingrese a la consola de rails usando el terminal:

rails c

Tipo

ActiveRecord::Migration.drop_table(:tablename)

Funciona bien para mi Esto eliminará la tabla anterior. No olvides correr

rails db:migrate
Srikanth V
fuente
7

Abre tu consola de rieles

ActiveRecord::Base.connection.execute("drop table table_name")
náutica viril
fuente
4

ActiveRecord::Base.connection.drop_table :table_name

nhegroj
fuente
2

Necesitaba eliminar nuestros scripts de migración junto con las tablas mismas ...

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

desde la ventana de terminal ejecutar:

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

o

$ rails runner "Util::Table.clobber_all"
Aaron Henderson
fuente
1

la mejor manera que puedes hacer es

rails g migration Drop_table_Users

entonces haz lo siguiente

rake db:migrate
Anoob K Bava
fuente
1

correr

rake db:migrate:down VERSION=<version>

¿Dónde <version>está el número de versión de su archivo de migración que desea revertir?

Ejemplo:-

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

si alguien está buscando cómo hacerlo en SQL.

tipo rails dbconsolede terminal

introducir la contraseña

En consola hacer

USE db_name;

DROP TABLE table_name;

exit

No olvide eliminar el archivo de migración y la estructura de la tabla del esquema

Shan
fuente
También puede abrirlo escribiendorails db
ARK
0

si quieres soltar una tabla específica puedes hacerlo

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

de lo contrario, si desea eliminar toda su base de datos, puede hacerlo

$rails db:drop
Nicollas
fuente
-1

Drop Table / Migration

ejecutar: - $ rails generar migración DropTablename

exp: - $ rails generan migración DropProducts

Pankaj Dhote
fuente
-1

Ejecute este comando: -

rails g migration drop_table_name

entonces:

rake db:migrate

o si está utilizando la base de datos MySql, entonces:

  1. iniciar sesión con la base de datos
  2. show databases;
  3. show tables;
  4. drop table_name;
Nitin Rakesh
fuente
3
¿Esta respuesta agrega algo a la respuesta aceptada existente? Si no, no hay necesidad de publicar esto.
Tom Lord
1
esto crea una migración vacía en rails 4.2, como ya se indicó en la pregunta misma.
bert bruynooghe
Esto es EXACTAMENTE lo que el OP intentó originalmente ... esta respuesta debería eliminarse
webaholik
Agregar una respuesta simple no merece ser rechazado. Todavía es relevante, supongo. Sea amable con los nuevos usuarios, por favor.
ARCA
-2

Si desea eliminar la tabla del esquema, realice la siguiente operación:

rails db:rollback
iamnair
fuente