Skip to content

Commit e35dc3b

Browse files
f-lab-pizclaude
andcommitted
feat: 스키마 변경 - price, stock 컬럼 추가
- Item 모델에 price(Numeric), stock(Integer) 컬럼 추가 - ItemBase 스키마 업데이트 (Decimal 타입 사용) - 마이그레이션 생성 및 적용 테스트 완료 - plan.md에 스키마 변경 실습 과정 상세 문서화 학습 내용: - alembic revision --autogenerate로 모델 변경 자동 감지 - nullable=True 사용으로 기존 데이터 호환성 유지 - upgrade/downgrade 테스트로 양방향 마이그레이션 검증 - alembic current, history 명령어로 상태 확인 실습 결과: - upgrade: 0fee3ec0c79f -> 211d1fe6d912 성공 - downgrade: 211d1fe6d912 -> 0fee3ec0c79f 성공 - 마이그레이션 체인이 정상적으로 연결됨 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent ce69d14 commit e35dc3b

File tree

4 files changed

+93
-5
lines changed

4 files changed

+93
-5
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"""Add price and stock columns to items table
2+
3+
Revision ID: 211d1fe6d912
4+
Revises: 0fee3ec0c79f
5+
Create Date: 2025-10-10 02:48:51.243684
6+
7+
"""
8+
from alembic import op
9+
import sqlalchemy as sa
10+
11+
12+
# revision identifiers, used by Alembic.
13+
revision = '211d1fe6d912'
14+
down_revision = '0fee3ec0c79f'
15+
branch_labels = None
16+
depends_on = None
17+
18+
19+
def upgrade() -> None:
20+
# ### commands auto generated by Alembic - please adjust! ###
21+
op.add_column('items', sa.Column('price', sa.Numeric(precision=10, scale=2), nullable=True))
22+
op.add_column('items', sa.Column('stock', sa.Integer(), nullable=True))
23+
# ### end Alembic commands ###
24+
25+
26+
def downgrade() -> None:
27+
# ### commands auto generated by Alembic - please adjust! ###
28+
op.drop_column('items', 'stock')
29+
op.drop_column('items', 'price')
30+
# ### end Alembic commands ###

app/models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sqlalchemy import Column, Integer, String, DateTime
1+
from sqlalchemy import Column, Integer, String, DateTime, Numeric
22
from sqlalchemy.sql import func
33
from app.database import Base
44

@@ -8,5 +8,7 @@ class Item(Base):
88
id = Column(Integer, primary_key=True, index=True)
99
name = Column(String, index=True)
1010
description = Column(String)
11+
price = Column(Numeric(10, 2), nullable=True) # 가격: 최대 10자리, 소수점 2자리
12+
stock = Column(Integer, default=0) # 재고: 기본값 0
1113
created_at = Column(DateTime(timezone=True), server_default=func.now())
1214
updated_at = Column(DateTime(timezone=True), onupdate=func.now())

app/schemas.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
from pydantic import BaseModel
22
from datetime import datetime
33
from typing import Optional
4+
from decimal import Decimal
45

56
class ItemBase(BaseModel):
67
name: str
78
description: Optional[str] = None
9+
price: Optional[Decimal] = None
10+
stock: int = 0
811

912
class ItemCreate(ItemBase):
1013
pass

plan.md

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,63 @@ alembic history
101101
- created_at, updated_at 타임스탬프
102102
- name, id에 인덱스 생성
103103

104-
#### 6-2. 스키마 변경 실습
105-
- [ ] Item 모델에 컬럼 추가 (price, stock)
106-
- [ ] 마이그레이션 생성 및 적용
107-
- [ ] upgrade/downgrade 테스트
104+
#### 6-2. 스키마 변경 실습 ✅
105+
스키마 변경과 마이그레이션 생성 과정을 실습했습니다.
106+
107+
**변경 내용:**
108+
- Item 모델에 컬럼 추가
109+
- `price`: Numeric(10, 2) - 가격 필드, nullable
110+
- `stock`: Integer - 재고 필드, 기본값 0
111+
- schemas.py도 함께 업데이트 (Decimal 타입 사용)
112+
113+
**마이그레이션 생성 과정:**
114+
```bash
115+
# 1. 먼저 기존 마이그레이션을 DB에 적용
116+
alembic upgrade head
117+
118+
# 2. 모델 변경 후 새 마이그레이션 생성
119+
alembic revision --autogenerate -m "Add price and stock columns to items table"
120+
```
121+
122+
**Alembic이 자동으로 감지한 변경 사항:**
123+
- Detected added column 'items.price'
124+
- Detected added column 'items.stock'
125+
126+
**생성된 마이그레이션 (211d1fe6d912):**
127+
```python
128+
def upgrade() -> None:
129+
op.add_column('items', sa.Column('price', sa.Numeric(precision=10, scale=2), nullable=True))
130+
op.add_column('items', sa.Column('stock', sa.Integer(), nullable=True))
131+
132+
def downgrade() -> None:
133+
op.drop_column('items', 'stock')
134+
op.drop_column('items', 'price')
135+
```
136+
137+
**upgrade/downgrade 테스트:**
138+
```bash
139+
# 마이그레이션 적용
140+
alembic upgrade head
141+
# 출력: Running upgrade 0fee3ec0c79f -> 211d1fe6d912
142+
143+
# 현재 버전 확인
144+
alembic current
145+
# 출력: 211d1fe6d912 (head)
146+
147+
# 한 단계 롤백
148+
alembic downgrade -1
149+
# 출력: Running downgrade 211d1fe6d912 -> 0fee3ec0c79f
150+
151+
# 다시 최신 버전으로
152+
alembic upgrade head
153+
# 출력: Running upgrade 0fee3ec0c79f -> 211d1fe6d912
154+
```
155+
156+
**학습 포인트:**
157+
- `--autogenerate`는 모델 변경을 자동 감지하지만 항상 검토 필요
158+
- nullable=True로 생성하여 기존 데이터와 호환성 유지
159+
- down_revision이 자동으로 이전 마이그레이션을 참조
160+
- upgrade/downgrade가 정확히 반대 동작 수행
108161

109162
#### 6-3. 무중단 배포 통합
110163
- [ ] deploy.sh에 마이그레이션 자동화

0 commit comments

Comments
 (0)