구조적인 부분 수정
This commit is contained in:
66
backend/migrations/fix_analysis_date_type.sql
Normal file
66
backend/migrations/fix_analysis_date_type.sql
Normal file
@@ -0,0 +1,66 @@
|
||||
-- Fix: stock_analysis.analysis_date 컬럼 타입 TIMESTAMP → DATE
|
||||
-- 배경:
|
||||
-- analysis_date가 TIMESTAMP이면 datetime.now() 저장 시 매 실행마다 서로 다른 타임스탬프가
|
||||
-- 생성되어 unique constraint가 무의미해지고 중복 행이 무한 누적된다.
|
||||
-- DATE 타입으로 변경하면 동일 (stock_code, 날짜) 쌍의 ON CONFLICT가 올바르게 동작한다.
|
||||
--
|
||||
-- 실행: psql -d autostock_db -f migrations/fix_analysis_date_type.sql
|
||||
-- 주의: 실행 전 DB 백업 권장
|
||||
-- 배치 스크립트 중단 후 실행할 것
|
||||
|
||||
DO $$
|
||||
DECLARE
|
||||
col_type TEXT;
|
||||
BEGIN
|
||||
-- 현재 analysis_date 컬럼 타입 확인
|
||||
SELECT data_type INTO col_type
|
||||
FROM information_schema.columns
|
||||
WHERE table_name = 'stock_analysis'
|
||||
AND column_name = 'analysis_date';
|
||||
|
||||
IF col_type IS NULL THEN
|
||||
RAISE EXCEPTION 'stock_analysis 테이블 또는 analysis_date 컬럼이 존재하지 않습니다.';
|
||||
END IF;
|
||||
|
||||
IF col_type = 'date' THEN
|
||||
RAISE NOTICE 'analysis_date 컬럼이 이미 DATE 타입입니다. 마이그레이션 불필요.';
|
||||
RETURN;
|
||||
END IF;
|
||||
|
||||
IF col_type NOT IN ('timestamp without time zone', 'timestamp with time zone') THEN
|
||||
RAISE EXCEPTION '예상치 못한 컬럼 타입: %. 수동 확인이 필요합니다.', col_type;
|
||||
END IF;
|
||||
|
||||
RAISE NOTICE '현재 타입: %. TIMESTAMP → DATE 변환을 시작합니다.', col_type;
|
||||
|
||||
-- Step 1: 기존 unique constraint 제거 (컬럼 타입 변경 전 반드시 삭제)
|
||||
ALTER TABLE stock_analysis DROP CONSTRAINT IF EXISTS uq_stock_analysis_code_date;
|
||||
RAISE NOTICE 'unique constraint uq_stock_analysis_code_date 삭제 완료';
|
||||
|
||||
-- Step 2: 동일 (stock_code, analysis_date::date) 쌍의 중복 행 제거
|
||||
-- TIMESTAMP 시절에 datetime.now()로 저장된 경우 같은 날짜에 여러 행이 존재할 수 있음
|
||||
-- → 가장 최근 id만 남기고 나머지 삭제
|
||||
DELETE FROM stock_analysis
|
||||
WHERE id NOT IN (
|
||||
SELECT DISTINCT ON (stock_code, analysis_date::date) id
|
||||
FROM stock_analysis
|
||||
ORDER BY stock_code, analysis_date::date, id DESC
|
||||
);
|
||||
RAISE NOTICE '중복 행 정리 완료 (남은 행 수: %)', (SELECT COUNT(*) FROM stock_analysis);
|
||||
|
||||
-- Step 3: 컬럼 타입 변환 (TIMESTAMP → DATE)
|
||||
ALTER TABLE stock_analysis
|
||||
ALTER COLUMN analysis_date TYPE DATE
|
||||
USING analysis_date::date;
|
||||
RAISE NOTICE 'analysis_date 컬럼 타입 변환 완료: % → DATE', col_type;
|
||||
|
||||
-- Step 4: unique constraint 재생성
|
||||
ALTER TABLE stock_analysis
|
||||
ADD CONSTRAINT uq_stock_analysis_code_date
|
||||
UNIQUE (stock_code, analysis_date);
|
||||
RAISE NOTICE 'unique constraint uq_stock_analysis_code_date 재생성 완료';
|
||||
|
||||
-- Step 5: 인덱스 확인 (기존 인덱스는 타입 변경 시 자동 갱신됨)
|
||||
RAISE NOTICE '마이그레이션 완료: analysis_date TIMESTAMP → DATE';
|
||||
END
|
||||
$$;
|
||||
Reference in New Issue
Block a user