Skip to content

신규 환경에서 db:migrate 시 테이블이 ra_news 대신 public 스키마에 생성됨 #933

Description

@stadia

요약

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) 전환도 후보. 다만 이건 영향 범위가 커서 별도 논의가 필요하다.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingrubyPull requests that update ruby code

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions