요약
config/database.yml:23 에 schema_search_path: "ra_news,public" 이 지정돼 있으나, 리포지토리 어디에도 ra_news 스키마를 생성하는 코드가 없다. 그 결과 신규 환경에서 db:migrate 로 셋업하면 모든 테이블이 public 스키마에 생성되어 프로덕션(ra_news)과 다른 레이아웃이 된다.
근거
CREATE SCHEMA 를 만드는 곳이 없음:
$ grep -rn "ra_news\|create_schema\|CREATE SCHEMA" db/migrate/ lib/tasks/ config/initializers/
(결과 없음)
ra_news 를 만드는 유일한 코드는 db/schema.rb 의 create_schema "ra_news" 인데, db/schema.rb 는 gitignore 대상이라 신규 클론에는 존재하지 않는다.
$ git check-ignore -v db/schema.rb
.gitignore:44:db/schema.rb db/schema.rb
PostgreSQL 은 search_path 의 첫 항목(ra_news)이 존재하지 않으면 다음 항목(public)에 객체를 생성한다.
재현
# schema.rb 가 없는 신규 클론 상태를 흉내
mv db/schema.rb /tmp/
RAILS_ENV=test rails db:drop:primary db:create:primary
RAILS_ENV=test rails db:migrate:primary
결과 — 45개 마이그레이션이 모두 실행되지만 테이블은 public 에 생성됨:
public.sites_pkey
public.index_sites_on_client_and_id
public.index_sites_on_deleted_at
public.index_sites_unique_url_for_rss
ra_news 스키마를 미리 만들어두면 정상적으로 ra_news 에 생성된다:
psql "postgres://localhost:5432/ra-news_test" -c 'CREATE SCHEMA IF NOT EXISTS ra_news;'
RAILS_ENV=test rails db:migrate:primary
# → ra_news.sites_pkey, ra_news.index_sites_unique_url_for_rss ...
파생 문제 — db:schema:load 라운드트립 불가
db/schema.rb 덤프가 create_schema "ra_news" 를 무조건 실행하기 때문에, 이미 ra_news 가 있는 DB 에 스키마를 로드하면 실패한다.
$ RAILS_ENV=test rails db:schema:load:primary
ActiveRecord::StatementInvalid: PG::DuplicateSchema: ERROR: schema "ra_news" already exists
또 덤프가 테이블명을 create_table "ra_news.sites" 처럼 스키마 수식된 형태로 쓰기 때문에, 이걸 다른 DB 에 로드하면 public 스키마에 "ra_news.sites" 라는 이름에 점이 든 테이블이 만들어진다.
영향
- 신규 개발자 온보딩 / CI 에서 프로덕션과 다른 스키마 레이아웃으로 셋업됨
db:schema:load, db:test:prepare 로 DB 를 재구축할 수 없음
- 프로덕션에는 이미
ra_news 가 존재하므로 운영 장애는 아님
제안
ra_news 스키마 생성을 리포지토리 코드로 옮긴다. 가장 앞선 마이그레이션(20260330052834_init_schema)보다 먼저 실행되는 별도 마이그레이션 또는 db:create 후크에서:
execute "CREATE SCHEMA IF NOT EXISTS ra_news"
라운드트립 문제까지 근본적으로 해결하려면 config.active_record.schema_format = :sql (structure.sql) 전환도 후보. 다만 이건 영향 범위가 커서 별도 논의가 필요하다.
요약
config/database.yml:23에schema_search_path: "ra_news,public"이 지정돼 있으나, 리포지토리 어디에도ra_news스키마를 생성하는 코드가 없다. 그 결과 신규 환경에서db:migrate로 셋업하면 모든 테이블이public스키마에 생성되어 프로덕션(ra_news)과 다른 레이아웃이 된다.근거
CREATE SCHEMA를 만드는 곳이 없음:ra_news를 만드는 유일한 코드는db/schema.rb의create_schema "ra_news"인데,db/schema.rb는 gitignore 대상이라 신규 클론에는 존재하지 않는다.PostgreSQL 은 search_path 의 첫 항목(
ra_news)이 존재하지 않으면 다음 항목(public)에 객체를 생성한다.재현
# schema.rb 가 없는 신규 클론 상태를 흉내 mv db/schema.rb /tmp/ RAILS_ENV=test rails db:drop:primary db:create:primary RAILS_ENV=test rails db:migrate:primary결과 — 45개 마이그레이션이 모두 실행되지만 테이블은
public에 생성됨:ra_news스키마를 미리 만들어두면 정상적으로ra_news에 생성된다:파생 문제 —
db:schema:load라운드트립 불가db/schema.rb덤프가create_schema "ra_news"를 무조건 실행하기 때문에, 이미ra_news가 있는 DB 에 스키마를 로드하면 실패한다.또 덤프가 테이블명을
create_table "ra_news.sites"처럼 스키마 수식된 형태로 쓰기 때문에, 이걸 다른 DB 에 로드하면public스키마에"ra_news.sites"라는 이름에 점이 든 테이블이 만들어진다.영향
db:schema:load,db:test:prepare로 DB 를 재구축할 수 없음ra_news가 존재하므로 운영 장애는 아님제안
ra_news스키마 생성을 리포지토리 코드로 옮긴다. 가장 앞선 마이그레이션(20260330052834_init_schema)보다 먼저 실행되는 별도 마이그레이션 또는db:create후크에서:라운드트립 문제까지 근본적으로 해결하려면
config.active_record.schema_format = :sql(structure.sql) 전환도 후보. 다만 이건 영향 범위가 커서 별도 논의가 필요하다.