Rails DB 마이그레이션-테이블 삭제 방법
필요하다고 생각되는 테이블을 추가했지만 더 이상 테이블을 사용할 계획이 없습니다. 해당 테이블을 어떻게 제거해야합니까?
이미 마이그레이션을 실행 했으므로 테이블이 데이터베이스에 있습니다. 나는 rails generate migration
이것을 처리 할 수 있어야하지만 아직 방법을 찾지 못했습니다.
난 노력 했어:
rails generate migration drop_tablename
그러나 그것은 단지 빈 마이그레이션을 생성했습니다.
Rails에서 테이블을 삭제하는 "공식적인"방법은 무엇입니까?
항상 원하는 코드를 갖기 위해 단순히 마이그레이션을 생성 할 수있는 것은 아닙니다. 빈 마이그레이션을 만든 다음 필요한 코드로 채울 수 있습니다.
마이그레이션에서 다양한 작업을 수행하는 방법에 대한 정보는 다음을 참조하십시오.
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
보다 구체적으로, 다음 방법을 사용하여 테이블을 삭제하는 방법을 볼 수 있습니다.
drop_table :table_name
먼저 원하는 이름으로 빈 마이그레이션을 생성하십시오. 적절한 날짜를 만들기 때문에 이런 식으로하는 것이 중요합니다.
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 :products
and raise ActiveRecord::IrreversibleMigration
입니다.
그런 다음 실행 rake db:migrate
하면 테이블이 삭제됩니다.
마이그레이션을 수동으로 작성하십시오. 예를 들어 rails g migration DropUsers
.
마이그레이션 코드에 관해서는 Maxwell Holder의 포스트 Rails Migration Checklist를 인용하겠습니다.
불량-실행 rake db:migrate
후 rake 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
: 여기에 제공된 답변이 제대로 작동 동안, 나는, 내가 여기에 그것을 발견 조금 더 '간단'무언가를 원하는 링크를 먼저 입력 콘솔 레일 :
$rails console
그런 다음 다음을 입력하십시오.
ActiveRecord::Migration.drop_table(:table_name)
그리고 나를 위해 일했습니다!
다음 명령을 사용하여 새 마이그레이션 파일을 작성해야합니다
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)
- 레일 g 마이그레이션 drop_users
- 마이그레이션 수정
class DropUsers < ActiveRecord::Migration
def change
drop_table :users do |t|
t.string :name
t.timestamps
end
end
end
- 레이크 db : 마이그레이션
완전히 "공식적"이 되려면 새로운 마이그레이션을 만들고 drop_table을 self.up에 넣어야합니다. self.down 메소드는 테이블을 완전히 재생성하기위한 모든 코드를 포함해야합니다. 마이그레이션을 생성 할 때 schema.rb에서 해당 코드를 가져 왔을 수 있습니다.
더 이상 필요하지 않다는 것을 알고있는 테이블을 작성하기 위해 코드를 작성하는 것은 조금 이상하게 보이지만, 모든 마이그레이션 코드를 완전하고 "공식"으로 유지하는 것이 맞습니까?
방금 삭제해야 할 테이블에 대해이 작업을 수행했지만 정직하게 "다운"을 테스트하지 않았으며 왜 그런지 잘 모르겠습니다.
레일 콘솔에서 간단히 테이블을 삭제할 수 있습니다. 먼저 콘솔을 엽니 다
$ rails c
그런 다음 콘솔 에이 명령을 붙여 넣으십시오.
ActiveRecord::Migration.drop_table(:table_name)
대체 TABLE_NAME을 삭제하려는 테이블.
터미널에서 직접 테이블을 삭제할 수도 있습니다. 응용 프로그램의 루트 디렉토리에 입력 하고이 명령을 실행하십시오.
$ rails runner "Util::Table.clobber 'table_name'"
가이드에있는대로 마이그레이션을 롤백 할 수 있습니다.
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
이 방법으로 롤백하고 마이그레이션을 되돌릴 수 있습니다
간단하고 공식적인 방법은 다음과 같습니다.
rails g migration drop_tablename
이제 db / migrate로 가서 drop_tablename을 파일 이름으로 포함하는 파일을 찾아서 편집하십시오.
def change
drop_table :table_name
end
그런 다음 실행해야합니다
rake db:migrate
콘솔에서.
레일 콘솔 열기
ActiveRecord::Base.connection.execute("drop table table_name")
마이그레이션 롤백, 다시 실행 등을 계속 사용하면서 예외를 발생 시키거나 지금 빈 테이블을 다시 작성하려는 시도 대신-
def change
drop_table(:users, force: true) if ActiveRecord::Base.connection.tables.include?('users')
end
ActiveRecord::Base.connection.drop_table :table_name
마이그레이션 스크립트에서 작동하도록 할 수 없었기 때문에이 솔루션을 진행했습니다. 터미널을 사용하여 레일 콘솔을 입력하십시오.
rails c
유형
ActiveRecord::Migration.drop_table(:tablename)
그것은 나를 위해 잘 작동합니다. 이전 테이블이 제거됩니다. 달리는 것을 잊지 마세요
rails db:migrate
테이블과 함께 마이그레이션 스크립트를 삭제해야했습니다 ...
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"
당신이 할 수있는 가장 좋은 방법은
rails g migration Drop_table_Users
다음 다음을 수행
rake db:migrate
운영
rake db:migrate:down VERSION=<version>
<version>
되돌리려는 마이그레이션 파일의 버전 번호는 어디에 있습니까 ?
예:-
rake db:migrate:down VERSION=3846656238
특정 테이블을 삭제하려면 할 수 있습니다
$ rails db:migrate:up VERSION=[Here you can insert timestamp of table]
그렇지 않으면 모든 데이터베이스를 삭제하려면 할 수 있습니다
$rails db:drop
이 명령을 실행하십시오 :-
rails g migration drop_table_name
그때:
rake db:migrate
또는 MySql 데이터베이스를 사용하는 경우 :
- 데이터베이스로 로그인
show databases;
show tables;
drop table_name;
아무도 SQL에서 그것을하는 방법을 찾고 있다면.
rails dbconsole
터미널에서 입력
암호를 입력
콘솔에서
USE db_name;
DROP TABLE table_name;
exit
스키마에서 마이그레이션 파일 및 테이블 구조를 제거하는 것을 잊지 마십시오
테이블 삭제 / 마이그레이션
run :-$ rails 마이그레이션을 생성합니다. DropTablename
exp :-$ 레일은 마이그레이션을 생성합니다.
스키마에서 테이블을 삭제하려면 아래 작업을 수행하십시오.
rails db:rollback
참고 URL : https://stackoverflow.com/questions/4020131/rails-db-migration-how-to-drop-a-table
'Programing' 카테고리의 다른 글
Java에서 파일의 MD5 체크섬 가져 오기 (0) | 2020.02.14 |
---|---|
"Xcode / iOS 라이센스에 동의하려면 관리자 권한이 필요합니다. sudo를 통해 루트로 다시 실행하십시오." (0) | 2020.02.14 |
Java 8에서 기본 메소드와 추상 클래스가있는 인터페이스 (0) | 2020.02.14 |
Sublime Text에서 파일 형식을 구문 연결에 맞게 사용자 지정하는 방법은 무엇입니까? (0) | 2020.02.13 |
git stash create로 생성 된 숨김을 삭제하는 방법은 무엇입니까? (0) | 2020.02.13 |