구조적인 부분 수정

This commit is contained in:
2026-02-24 11:38:35 +09:00
parent 6d9c9cb010
commit 883f87753c
15 changed files with 789 additions and 672 deletions

View 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
$$;