Rails DB 마이그레이션-테이블 삭제 방법


507

필요하다고 생각되는 테이블을 추가했지만 더 이상 테이블을 사용할 계획이 없습니다. 해당 테이블을 어떻게 제거해야합니까?

이미 마이그레이션을 실행 했으므로 테이블이 데이터베이스에 있습니다. 나는 rails generate migration이것을 처리 할 수 ​​있어야하지만 아직 얼마나 알아 냈지 않았습니다.

난 노력 했어:

rails generate migration drop_tablename

그러나 그것은 단지 빈 마이그레이션을 생성했습니다.

Rails에서 테이블을 삭제하는 "공식적인"방법은 무엇입니까?


1
rails generate migration테이블 생성, 열 추가 또는 변경 등을위한 마이그레이션 코드 생성을위한 명령 줄 옵션이 있기 때문에 테이블을 삭제하는 옵션이 있으면 좋지만 그렇지 않습니다. 물론, up파트를 작성하는 것은 간단합니다. 단지 호출 만하면됩니다. drop_table그러나 down테이블을 다시 생성 하는 파트는 항상 그렇게 단순하지는 않습니다. 특히 문제가되는 테이블의 스키마가 초기 생성 후 마이그레이션에 의해 변경된 경우에는 더욱 그렇습니다. 누군가 Rails 개발자에게 그러한 옵션을 추가하는 것이 좋은 아이디어라고 제안해야 할 것입니다.
Teemu Leisti

3
@TeemuLeisti schema.rb에서 현재 테이블 정의를 복사하여 붙여 넣는 것은 어떻습니까? 나는 항상 이런 식으로합니다 ...
jasoares

1
@ João Soares : 알겠습니다. 프로세스가 자동화 될 수있는 경우에는, 당신이 그냥 줄 수 있도록하는 것이 좋을 것입니다 rake필요한 생산 것이라고, 매개 변수로 테이블의 이름으로, 마이그레이션 창조 명령 updown기능을.
Teemu Leisti

답변:


647

항상 원하는 코드를 갖기 위해 단순히 마이그레이션을 생성 할 수있는 것은 아닙니다. 빈 마이그레이션을 만든 다음 필요한 코드로 채울 수 있습니다.

마이그레이션에서 다양한 작업을 수행하는 방법에 대한 정보는 다음을 참조하십시오.

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

보다 구체적으로, 다음 방법을 사용하여 테이블을 삭제하는 방법을 볼 수 있습니다.

drop_table :table_name

3
이것은 나에게도 효과가있었습니다. 그러나 전체 마이그레이션 (처음부터 설치)에서 테이블이 먼저 작성되고 나중에 다시 삭제됩니다. 도로에서 생성 및 드롭 마이그레이션을 제거하는 것이 안전합니까?
berkes

2
테이블을 삭제하거나 이전 데이터베이스 스키마로 되 돌리는 것이 더 나은지 여부에 대한 어떤 견해가 있습니까?
윌리엄은

3
테이블을 다 사용했는데 더 이상 테이블을 사용하지 않을 계획이라면 그냥 떨어 뜨려야합니다. 사용하지 않는 경우 제거하는 것이 좋습니다.
Pete

6
@BederAcostaBorges의 답변 은 더 자명하고 정확합니다
onerinas

2
외래 키를 모두 제거하는 방법? 다른 테이블에 삭제중인 테이블을 가리키는 열이 있습니다.
Martin Konicek

352

먼저 원하는 이름으로 빈 마이그레이션을 생성하십시오. 적절한 날짜를 만들기 때문에 이런 식으로하는 것이 중요합니다.

rails generate migration DropProductsTable

이렇게하면 20111015185025_drop_products_table.rb와 같이 / db / migrate /에 .rb 파일이 생성됩니다.

이제 다음과 같이 해당 파일을 편집하십시오.

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

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

내가 추가 한 유일한 것은 drop_table :productsand raise ActiveRecord::IrreversibleMigration입니다.

그런 다음 실행 rake db:migrate하면 테이블이 삭제됩니다.


14
삭제중인 테이블을 다시 작성하려면 다운 마이그레이션을 사용해야합니다.
fflyer05

1
이 마이그레이션은 개발 중에도 롤백 할 수 없습니다. 다운 마이그레이션을 비워 두는 것이 더 좋습니까?
mhriess

1
이것은 더 나은 응답 +의 fflyer의 주석입니다
잭 샤피로

2
@mjnissim과 fflyer05는 다운 메소드에서 테이블을 다시 작성 해야하는 이상한 일을 피하기 위해 정확합니다.
Sebastialonso

4
테이블을 삭제하면 모든 데이터가 삭제됩니다. down메소드 에서 다시 작성하면 복구하지 않으므로 실제로는 롤백이 아닙니다. 마이그레이션이 복구 될 수 있다는 잘못된 의미를 부여하는 것보다 마이그레이션이 되돌릴 수 없음을 명확하게 표시하는 것이 좋습니다.
vivi

314

마이그레이션을 수동으로 작성하십시오. 예를 들어 실행합니다 rails g migration DropUsers.

마이그레이션 코드에 관해서는 Maxwell Holder의 포스트 Rails Migration Checklist를 인용하겠습니다.

불량-실행 rake db:migraterake db:rollback실패

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

GOOD-마이그레이션을 되돌릴 수 없음을 나타냅니다.

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

  def down
    fail ActiveRecord::IrreversibleMigration
  end
end

더 나은-실제로 뒤집을 수 있습니다

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

에서 블록을 잘라 붙여 넣는 경우 외래 키 schema.rb도 검색 schema.rb해야합니다. 그런 다음 외래 키 정의를 drop_table블록에 추가하십시오 .t.foreign_key "other_table"
Lencho Reyes

197

: 여기에 제공된 답변이 제대로 작동 동안, 나는, 내가 여기에 그것을 발견 조금 더 '간단'무언가를 원하는 링크를 먼저 입력 콘솔 레일 :

$rails console

그런 다음 다음을 입력하십시오.

ActiveRecord::Migration.drop_table(:table_name)

그리고 나를 위해 일했습니다!


당신이 실행할 때까지이 모델은 아직 거기rails destroy model User
gm2008

2
테이블을 잘 제거하려면이 옵션 만 실행하십시오. 레일은이 하락을 인식하지 못합니다. 이 명령을 실행 한 후 마이그레이션이 중단되었습니다. CREATE, DROP ... ETC를 작성할 수 없습니다. 오류 SQLite3 :: SQLException : 해당 테이블 없음 : 발생 : DROP TABLE "sometable"
zee

36

다음 명령을 사용하여 새 마이그레이션 파일을 작성해야합니다

rails generate migration drop_table_xyz

drop_table 코드를 새로 생성 된 마이그레이션 파일 (db / migration / xxxxxxx_drop_table_xyz)에 작성하십시오.

drop_table :tablename

또는 마이그레이션하지 않고 테이블을 삭제하려면 레일 콘솔을 열면됩니다.

$ rails c

다음 명령을 실행하십시오.

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

또는 더 간단한 명령을 사용할 수 있습니다

ActiveRecord::Migration.drop_table(:table_name)

21
  1. 레일 g 마이그레이션 drop_users
  2. 마이그레이션 수정
    class DropUsers < ActiveRecord::Migration
      def change
        drop_table :users do |t|
          t.string :name
          t.timestamps
        end
      end
    end
  1. 레이크 db : 마이그레이션

13

완전히 "공식적"이 되려면 새로운 마이그레이션을 만들고 drop_table을 self.up에 넣어야합니다. self.down 메소드는 테이블을 완전히 재생성하기위한 모든 코드를 포함해야합니다. 마이그레이션을 생성 할 때 schema.rb에서 해당 코드를 가져 왔을 수 있습니다.

더 이상 필요하지 않다는 것을 알고있는 테이블을 작성하기 위해 코드를 작성하는 것은 조금 이상하게 보이지만, 모든 마이그레이션 코드를 완전하고 "공식"으로 유지하는 것이 맞습니까?

방금 삭제해야 할 테이블에 대해이 작업을 수행했지만 정직하게 "다운"을 테스트하지 않았으며 왜 그런지 잘 모르겠습니다.


1
이상하지만 이것도해야 할 것 같습니다.
digitalWestie

7
또는 raise ActiveRecord::IrreversibleMigrationself.down 메소드에서 다음을 사용할 수 있으므로 LEAST에서 롤백하려고하면 오류 / 통지를합니다.
Steph Rose

1
테스트하지 않은 코드를 내 프로젝트에 도입하기 때문에 다운을 테스트합니다. 원래 마이그레이션 방법을 어떻게 재사용 할 수 있습니까? 나는 해봤 CreateMyTable.upActiveRecord::Migrator.run(:up, ActiveRecord::Migrator.migrations_paths, X)X는 원래 테이블을 만든 마이그레이션입니다 만, 어느 쪽도 작동하지 않습니다 - 모두가 접근에서, 마이그레이션이 이미 적용되었는지 여부를 먼저 확인을 AR,하고있는 경우 자동으로 건너 뜁니다. `
Isaac Betesh

12

레일 콘솔에서 간단히 테이블을 삭제할 수 있습니다. 먼저 콘솔을 엽니 다

$ rails c

그런 다음 콘솔 에이 명령을 붙여 넣으십시오.

ActiveRecord::Migration.drop_table(:table_name)

대체 TABLE_NAME을 삭제하려는 테이블.

터미널에서 직접 테이블을 삭제할 수도 있습니다. 응용 프로그램의 루트 디렉토리에 입력 하고이 명령을 실행하십시오.

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

10

간단하고 공식적인 방법은 다음과 같습니다.

  rails g migration drop_tablename

이제 db / migrate로 가서 drop_tablename을 파일 이름으로 포함하는 파일을 찾아서 편집하십시오.

    def change
      drop_table :table_name
    end

그런 다음 실행해야합니다

    rake db:migrate 

콘솔에서.


9

가이드에있는대로 마이그레이션을 롤백 할 수 있습니다.

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

마이그레이션을 생성하십시오.

rails generate migration revert_create_tablename

마이그레이션을 작성하십시오.

require_relative '20121212123456_create_tablename'

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

이 방법으로 롤백하고 마이그레이션을 되돌릴 수 있습니다


8

마이그레이션 롤백, 다시 실행 등을 계속 사용하면서 예외를 발생 시키거나 지금 빈 테이블을 다시 작성하려는 시도 대신-

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

8

마이그레이션 스크립트에서 작동하도록 만들 수 없었 으므로이 솔루션을 계속 진행했습니다. 터미널을 사용하여 레일 콘솔을 입력하십시오.

rails c

유형

ActiveRecord::Migration.drop_table(:tablename)

그것은 나를 위해 잘 작동합니다. 이전 테이블이 제거됩니다. 달리는 것을 잊지 마세요

rails db:migrate

7

레일 콘솔 열기

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


2

테이블과 함께 마이그레이션 스크립트를 삭제해야했습니다 ...

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

터미널 창에서 실행 :

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

또는

$ rails runner "Util::Table.clobber_all"

1

당신이 할 수있는 가장 좋은 방법은

rails g migration Drop_table_Users

다음을 수행

rake db:migrate

1

운영

rake db:migrate:down VERSION=<version>

어디 <version>되돌리려는 마이그레이션 파일의 버전 번호는 ?

예:-

rake db:migrate:down VERSION=3846656238

1

아무도 SQL에서 그것을하는 방법을 찾고 있다면.

유형 rails dbconsole터미널에서

암호를 입력

콘솔에서

USE db_name;

DROP TABLE table_name;

exit

스키마에서 마이그레이션 파일 및 테이블 구조를 제거하는 것을 잊지 마십시오


그냥 입력하여 열 수도 있습니다rails db
ARK

0

특정 테이블을 삭제하려면 할 수 있습니다

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

그렇지 않으면 모든 데이터베이스를 삭제하려면 할 수 있습니다

$rails db:drop

-1

테이블 삭제 / 마이그레이션

run :-$ rails 마이그레이션을 생성합니다. DropTablename

exp :-$ 레일은 마이그레이션을 생성합니다.


-1

이 명령을 실행하십시오 :-

rails g migration drop_table_name

그때:

rake db:migrate

또는 MySql 데이터베이스를 사용하는 경우 :

  1. 데이터베이스로 로그인
  2. show databases;
  3. show tables;
  4. drop table_name;

3
이 답변이 기존의 승인 된 답변에 추가합니까? 그렇지 않은 경우이를 게시 할 필요가 없습니다.
Tom Lord

1
이것은 질문 자체에서 이미 언급했듯이 rails 4.2에서 빈 마이그레이션을 만듭니다.
bert bruynooghe

이는 영업 이익은 원래 ...이 대답을 제거해야 노력 정확히
webaholik

간단한 대답을 추가을 downvoted 할 자격이 없습니다. 그것은 여전히 관련 같아요. 새로운 사용자가 만족 종류에합니다.
ARK

-2

스키마에서 테이블을 삭제하려면 아래 작업을 수행하십시오.

rails db:rollback
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.