์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

fastapi ์—์„œ alembic ์‚ฌ์šฉํ•˜๊ธฐ

์ฃผ์˜ ๐Ÿฑ 2024. 4. 18. 11:45
728x90
๋ฐ˜์‘ํ˜•

SQLAlchemy + pydamic ๋ณด๋‹ค๋Š” SQLAlchemy+ alembic๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ถ”์„ธ. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ ๋ณ€๊ฒฝ์ด ๋” ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

Alembic์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ช‡ ๋‹จ๊ณ„๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ์ดˆ๊ธฐ ์„ค์ •, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ์˜ ์ƒ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์˜ ์ ์šฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

SQLAlchemy ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, ๋จผ์ € Alembic ์„ค์ •์„ ์™„๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ํ›„, ๋ชจ๋ธ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. Alembic ์„ค์ •: ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์—์„œ $ pip install alembic ;  alembic init alembic ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Alembic์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ alembic ํด๋”์™€ ์„ค์ • ํŒŒ์ผ์ธ alembic.ini๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. 

-- ๊ฐ ํŒŒ์ผ์— ๋Œ€ํ•œ ๊ฐ„๋žต ์„ค๋ช…

  • alembic.ini
    • env.py ํŒŒ์ผ์—์„œ Configuration ํŒŒ์ผ๋กœ ์‚ฌ์šฉ๋˜๋Š” alembic ์„ค์ • ํŒŒ์ผ
  • env.py
    • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ ์‹คํ–‰๋˜๋Š” ์„œ๋ฒ„ ์—ฐ๊ฒฐ ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹คํ–‰ ์ฝ”๋“œ
  • script.py.mako
    • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ
  • versions
    • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ์ €์žฅ 

  --  env.py ํŒŒ์ผ๋กœ ํ•œ ๋ฒˆ ํ™˜๊ฒฝ์„ ์„ธํŒ…ํ•˜๊ณ  ๊ทธ ์ดํ›„๋กœ๋Š” versions ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ด€๋ฆฌ

  1.  
  2.  alembic.ini ํŒŒ์ผ์—์„œ SQLAlchemy ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค URL์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  alembic/env.py ํŒŒ์ผ์—์„œ target_metadata ๋ณ€์ˆ˜๋ฅผ ๋ชจ๋ธ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

<alembic/env.py ํŒŒ์ผ์—์„œ target_metadata ๋ณ€์ˆ˜๋ฅผ ๋ชจ๋ธ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ์„ค์ •>

# ์˜ˆ์‹œ: myapp/models.py ํŒŒ์ผ์— ์ •์˜๋œ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
from myapp.models import Base  # myapp/models.py ํŒŒ์ผ์—์„œ Base ์ž„ํฌํŠธ
target_metadata = Base.metadata

 

<alembic.ini ํŒŒ์ผ์—์„œ sqlalchemy.url ์„ค์ •์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด๋กœ ์ˆ˜์ •>

# alembic.ini ํŒŒ์ผ ๋‚ด
sqlalchemy.url = driver://user:pass@localhost/dbname

 

2. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ ์ƒ์„ฑ:

๋ชจ๋ธ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, alembic revision --autogenerate -m "Add japanese and known tables" ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ž๋™์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๊ณ  ์„ค๋ช…์„ ํฌํ•จํ•œ ์ƒˆ๋กœ์šด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ alembic/versions ํด๋”์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

3. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ ์šฉ:

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉํ•˜๋ ค๋ฉด, alembic upgrade head ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ์ตœ์‹  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์„ ํ†ตํ•ด, SQLAlchemy ๋ชจ๋ธ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๋ฐ˜์‘ํ˜•