alembic revision의 의미

Today I Learned 날짜 2024년 11월 20일 수요일 내용 Alembic revision FastAPI에선 Postgresql 의 마이그레이션을 위해 alembic을 사용한다. Django 처럼 프레임워크에서 제공하는 ORM이 없다보니 SQLAlchemy 를 사용하는데, 이 SQLAlchemy에서 제공하는 도구다. alembic revision --autogenerate 라는 명령어로 데이터베이스 변경 내역을 스크립트로 만들고, alembic upgrade head 명령어로 입력한다. 네이버 상품 상세페이지에 추가되는 이미지에 이제는 인스타그램 게시글도 추가되도록 만들었다. 오늘이 실서버 배포날이라 실서버에서 마이그레이션을 적용하는데 이런 오류가 떴다. 1 2 3 4 File "/usr/local/lib/python3.12/site-packages/alembic/script/revision.py", line 245, in _revision_map down_revision = map_[downrev] ~~~~^^^^^^^^^ KeyError: 'eea2e21515bc' 이게 무슨소리인고 찾아보니 이전 스크립트가 없다는 의미다. 이해를 위해 revision에 대해 알아보자. ...

2024년 11월 20일 · 3 분 · 배준수

아마존엔 없는 것 빼고 다 있다.

Today I Learned 날짜 2024년 1월 3일 수요일 내용 SQLAlchemy 매주 새로 생성된 리뷰들에 관한 정보를 담은 메일을 보내는 Task를 얼추 완성했다. CSS에 대해 추가적인 피드백이 필요하긴 하지만 우선 로직과 코드 자체에 대해 확인이 필요했다. 명명 이번엔, 변수나 함수 이름, 엔드포인트에 대해서 조금 더 신경썼다. 맨 처음 코드를 작성할 떈 아무래도 머릿속에 생각나는대로 적거나 GPT가 써준대로 적게 된다. Task를 진행하다보면 어느새 이 이름에 익숙해져 그대로 PR을 올리는 경우가 많았다. 다른사람이 내 코드를 볼 때, 이름의 의미를 쉽게 파악할 수 있다면 코드를 읽기 훨씬 수월해지기 떄문에 PR올리기 전 코드를 정리하는 시간을 따로 가졌다. 요청을 주고 받을 때 양쪽의 변수 이름을 동일하게 해서 함수의 흐름을 따라가는 사람이 헷갈리지 않도록 했다. 함수가 결국 반환하는 데이터가 무엇인지를 이름을 통해 알 수 있게 했다. 예를 들어, 내 Task가 결국 email을 보내야 하는 거지만 내가 구현할 함수 중에는 그저 Email을 위해 필요한 데이터만 조회하는 함수도 존재한다. 이 함수의 이름에는 email이 들어갈 필요가 전혀 없다. 나야 Task를 진행하면서 자연스레 넘어가게 되지만, 배경을 모르는 사람이 보면 코드를 볼 때 존재하지도 않는 메일 전송과 관련된 로직을 신경써야 하니까. ...

2024년 1월 3일 · 4 분 · 배준수

데모페이지를 완성했다

Today I Learned 날짜 2023년 12월 20일 수요일 내용 데모 관련 Task 끝 어제 발견했던대로, DB에 commit이 일어나면 object가 refresh되었다. Loading Relationships In the last step, we called [Session.commit()](https://docs.sqlalchemy.org/en/14/orm/session_api.html#sqlalchemy.orm.Session.commit) which emitted a COMMIT for the transaction, and then per [Session.commit.expire_on_commit](https://docs.sqlalchemy.org/en/14/orm/session_api.html#sqlalchemy.orm.Session.commit.params.expire_on_commit) expired all objects so that they refresh for the next transaction. SQLAlchemy docs에서 찾은 내용이다. db에 commit하면 현재 session의 object들이 expired되고, object를 새로 로드해야 한다. 로그인할 때, object로 계정 정보로 DB에서 관련된 shop들을 가져오는데, 데모 로그인떄는 데모 스토어로 사용할 shop만 가져오도록 로직을 작성했다. 이 object가 동기화되면서 내가 선택한 shop이 무용지물 되버린건데.. 내가 몰랐던 SQLAlchemy의 기능인 것 같다. ...

2023년 12월 20일 · 1 분 · 배준수