Rails에 테이블이 있는지 확인


174

테이블이 없으면 작동하지 않는 갈퀴 작업이 있습니다. 웹 사이트에서 20 명 이상의 엔지니어와 함께 일하고 있으므로 해당 테이블을 채울 레이크 작업을 수행하기 전에 테이블을 마이그레이션했는지 확인하고 싶습니다.

AR에는 다음과 같은 방법이 Table.exists있습니까? 이들이 테이블을 성공적으로 마이그레이션했는지 어떻게 확인할 수 있습니까?


12
농담은 .. 테이블을 마이그레이션하는 데 몇 명의 엔지니어가 필요
합니까?

1
프로덕션에서 1. 준비 단계에서 여러 번 및 여러 번.
thenengah

2
레이크 작업이 시작될 때 마이그레이션을 실행하는 것이 더 쉽지 않습니까? 따라서 누락 된 테이블에 대해 걱정할 필요가 없습니다.
raskhadafi

@raskhadafi : 구성 / 초기화 프로그램에서 누락 된 테이블을 사용하면 문제가 발생합니다. rake db:migrate
ocodo

답변:


302

Rails 5에서 API는 테이블 / 뷰 , 집합 적으로 데이터 소스 와 관련 하여 명백해졌습니다 .

# Tables and views
ActiveRecord::Base.connection.data_sources
ActiveRecord::Base.connection.data_source_exists? 'kittens'

# Tables
ActiveRecord::Base.connection.tables
ActiveRecord::Base.connection.table_exists? 'kittens'

# Views
ActiveRecord::Base.connection.views
ActiveRecord::Base.connection.view_exists? 'kittens'

Rails 2, 3 & 4에서 API는 테이블 에 관한 입니다.

# Listing of all tables and views
ActiveRecord::Base.connection.tables

# Checks for existence of kittens table/view (Kitten model)
ActiveRecord::Base.connection.table_exists? 'kittens'

마이그레이션 상태 얻기 :

# Tells you all migrations run
ActiveRecord::Migrator.get_all_versions

# Tells you the current schema version
ActiveRecord::Migrator.current_version

마이그레이션 또는 메타 데이터에 더 많은 API가 필요한 경우 다음을 참조하십시오.


4
ActiveRecord::Base.connection.table_exist 'users'users 테이블을 확인합니다.
thenengah

4
ActiveRecord::Base.connection.table_exists? 'kittens새끼 고양이 테이블을 확인합니다. 내가 모든 새끼 고양이를 파괴하지 않는 한! drop_table :kittens
thenengah

1
고마워요! 방금 사용한.index_exists?('kittens', 'paws')
Trip

14
이것은 ActiveRecord 3.2.11에서 작동합니다 drop_table(:hosts_users) if table_exists? :hosts_users
Greg

1
ActiveRecord::Base.connection.data_source_exists? 'table_name'올바른 것입니다
Dorian

57

테이블이 존재하지 않더라도 :

모델 Kitten, 예상 테이블 kittens 레일 3 :

Kitten.table_exists? # => 거짓


+ 1 더 우아한 솔루션. 모델이 테이블 이름을 재정의하는 경우에도 작동합니다.
Daniel Rikowski

1
이것이 Rails 2.3.18-lts (스크립트 / 콘솔을 실행하기 전에 누락 된 하나의 테이블에서 테스트 됨)에서 작동하는지 확인
iheggie

32

마이그레이션을 통해 테이블을 제거하려고하는 동안 이것을 발견했습니다.

drop_table :kittens if (table_exists? :kittens)
ActiveRecord::Migration.drop_table :kittens if (ActiveRecord::Base.connection.table_exists? :kittens)

Rails 3.2에서 작동

이 간단한 형태는 Rails 5에서 사용할 수 있습니다.

drop_table :kittens, if_exists: true

참조 : https://github.com/rails/rails/pull/16366

Rails 5 ActiveRecord의 CHANGELOG는 다음과 같습니다.

drop_table에 대한 : if_exists 옵션을 소개하십시오.

예:

drop_table(:posts, if_exists: true)

실행됩니다 :

DROP TABLE IF EXISTS posts

테이블이 존재하지 않으면 if_exists : false (기본값)는 예외를 발생시키는 반면 if_exists : true는 아무것도 수행하지 않습니다.


테이블이 존재하는 것처럼 보이기 때문에 테이블이 실제로 뷰인 경우 실패하지만 DROP TABLE은 삭제할 수 없습니다.
mcr

8

레일스 5.1

if ActiveRecord::Base.connection.data_source_exists? 'table_name'
   drop_table :table_name
end

또는

drop_table :table_name, if_exists: true

2
table_exists는 여전히 rails-5에서 작동하지만 체크 테이블로만 작동합니다. 5.0.1부터 뷰와 테이블을 확인합니다. data_source_exists는 동작을 유지하며 table_exists는 테이블 만 검사하도록 변경됩니다.
John Naegle

그는 마이그레이션에서 테이블을 확인하도록 요청하지 않고 테이블이 레이크 작업에 있는지 확인해야합니다.
Juan Furattini

0

이를 수행하는 올바른 방법은 Model.table_exists?

class Dog < ApplicationRecord
  # something
end

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