How-to-use-alembic.md

์˜ค๋Š˜์€ python์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํˆด alembic ์‚ฌ์šฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด๋ คํ•ฉ๋‹ˆ๋‹ค.

์ตœ๊ทผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋Š” ์กธ์—…์ž‘ํ’ˆ์—์„œ FastAPI๋ฅผ ์ด์šฉํ•œ ์„œ๋ฒ„๊ฐœ๋ฐœ์„ ๋งก๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ Django๋ฅผ ์“ธ ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ manage.py์—์„œ ์ œ๊ณตํ•˜๋Š” migration ๊ธฐ๋Šฅ์ด ์œ ์šฉํ•ด์„œ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†์„๊นŒ ์ฐพ๋˜ ์ค‘ alembic์ด๋ผ๋Š” ํˆด์„ ์ฐพ๊ฒŒ๋˜์–ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(migration)?

alembic์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ ์ „ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด๋ž€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค. ์ง์—ญํ•˜๋ฉด

migration : ์ด์ฃผ, ์ด์ „

์ •๋ณด๊ธฐ์ˆ  ๋ถ„์•ผ์—์„œ๋Š” ์šด์˜ํ™˜๊ฒฝ์„ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ตœ๊ทผ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋ฅผ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉด์„œ ๊ธฐ์กด ์˜จํ”„๋ ˆ๋ฏธ์Šค ๋ฐฉ์‹์˜ IDCํ™˜๊ฒฝ์—์„œ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ฒƒ์„ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ํˆด๋“ค์ด ๋งŽ์ด ๋“ฑ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ex. AWS Storage Gateway, AWS DataSync, AWS Snowcone ๋“ฑ

๊ทผ๋ฐ ์ด๋Ÿฐ ๊ฒƒ๋“ค์€ ์ธํ”„๋ผ ์ž์ฒด๋ฅผ ์ด์ „ํ• ๋•Œ ์“ฐ๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ, alembic์€ ๊ทธ๋Ÿผ ๋ญ˜๊นŒ์š”?

alembic์€ ORM์œผ๋กœ ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ• ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

alembic ์Šคํฌ๋ฆฝํŠธ์—๋Š” upgrade()์™€ downgrade() ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ œ์–ดํ•˜๊ณ  ๋ณ€๊ฒฝ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ €์žฅํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์žฌ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜

alembic์€ pip ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

pip install alembic

์‚ฌ์šฉ๋ฒ•

์ดˆ๊ธฐํ™”

alembic init ํด๋”๋ช…

์œ„์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ง€์ •ํ•œ ํด๋”๋ช…์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ด€๋ฆฌ ํด๋”๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™

์œ„์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋งŒ๋“ค์–ด์ง„ env.py์˜ run_migrations_offline() ํ•จ์ˆ˜์˜ url ๋ณ€์ˆ˜์— ์—ฐ๊ฒฐํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค URI๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น URI๋Š” alembic.ini ํŒŒ์ผ์— ์ž‘์„ฑ๋˜์–ด์žˆ๋Š”๋ฐ ํ•ด๋‹น ํŒŒ์ผ์—์„œ

sqlalchemy.url = drivier://user:password@localhost.dbname

์œ„์˜ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์—ฐ๊ฒฐํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค URI๋กœ ๋ฐ”๊พธ์–ด ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” alembic.ini๊ฐ€ ์•„๋‹ˆ์–ด๋„ dotenv ๊ฐ™์€ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ env.py์— ๋”ฐ๋กœ ์ž…๋ ฅํ•˜์—ฌ ์‚ฌ์šฉํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค๐Ÿ˜ƒ

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

์ด์ œ ์‹ค์ œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์„ ํ•ด๋ด…์‹œ๋‹ค.

alembic์—์„œ๋Š” revision๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ migration script๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ alembic revision -m "[Migration Script]"
Generating /path/to/my_folder/practice/versions/f09152543072_example.py ...  done

revision์„ ์ƒ์„ฑํ•˜๋ฉด versionsํด๋” ๋ฐ‘์— {revisioncode}_{migrationscript}.py๋กœ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ํŒŒ์ผ์—๋Š” upgrade(), downgrade()

๋‘ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ, ํ•ด๋‹น revision์„ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉํ•  ๋•Œ ์ˆ˜ํ–‰๋  ์ž‘์—…์ด upgrade()์— ๋ช…์‹œ๋ฉ๋‹ˆ๋‹ค. downgrade()์—๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์„ ๋•Œ ์žˆ๊ธฐ์ „ ์ƒํƒœ๊ฐ€ ๋ช…์‹œ๋ฉ๋‹ˆ๋‹ค.

  • ์ฒซ๋ฒˆ์งธ revision์—๋Š” ๋งŒ๋“ค์–ด์ง„๋Œ€๋กœ ๋น„์›Œ๋‘๊ฑฐ๋‚˜ table drop์„ ์ ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ •๋ง ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— revision์„ ์ ์šฉ์‹œ์ผœ ๋ด…์‹œ๋‹ค.

$ alembic upgrade head

๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€์žฅ ์ตœ๊ทผ์˜ revision์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด์™ธ ๊ธฐ๋Šฅ๋“ค

alembic์€ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ migration history๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ alembic history
  • downgrade ํ•˜๋Š” ๋ฐฉ๋ฒ• downgrade๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ๋Š” ํŠน์ • revision๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ -1, -2 ๊ฐ™์ด ํ˜„์žฌ์ƒํƒœ์—์„œ ์ƒ๋Œ€์ ์ธ ์œ„์น˜์˜ downgrade๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ alembic downgrade <down_revision ๋ฒˆํ˜ธ>

$ alembic downgrade -1 #๊ฐ€์žฅ ์ตœ์‹  ๋ฒ„์ „์˜ ์ „ ๋‹จ๊ณ„๋กœ downgrade ์ˆ˜ํ–‰

๋งˆ๋ฌด๋ฆฌ

ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ–ˆ๋˜ alembic์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. pythonํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ nodejs, go ๋“ฑ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋กœ ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ , alembic์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ ๋งํฌ๋ฅผ ๊ณต์œ ํ•ด๋‘˜ํ…Œ๋‹ˆ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค:D

์ฐธ๊ณ  ๋งํฌ

Last updated