왜인지 유저가 중복되는 일이 생겼다.
예시를 들면 Username, username, uSername, USerNaME 모두 같은 유저로 구분되는데, 데이터는 별개로 저장되고 있었다.
그래서 유저 이름은 항상 lowercase로 저장하게 하려고 했고 이런 로직은 도메인 영역인 모델에서 관리하는게 맞다고 판단했다.
SQLModel은 Pydantic 기반으로 동작하니 그냥 @field_validator를 사용했는데 이게 먹히지 않았다.
여기서 이런 글을 찾았는데, 모델을 table=True로 설정하면 validator가 안먹힌다는 것이였다.
https://github.com/tiangolo/sqlmodel/discussions/787#discussioncomment-9303157
그래서 모델부분을 담당하는 부분 UserBase과 테이블 User을 나눠야 겠다고 생각했다. (명명규칙은 SQLModel 공식문서를 따른 것이다.)
기존에는 User() 생성자로 객체를 생성했지만 이젠 User.model_validate(user_base)로 해야 한다. 뭔가.. 이상하지만 공식 문서에선 이렇게 하라고 되어있다.
그래서 이렇게 만들었다.
class UserBase(SQLModel, DatedAtMixin):
username: str = Field(unique=True)
@field_validator("username", mode="before")
@classmethod
def username_to_lowercase(cls, username: str) -> str:
return username.lower()
class User(UserBase, table=True):
…
그리고 입력받는 부분에서도 값을 수정했다.
async def get_username(username: str) -> str:
return username.lower()
@router.get("/pokemons/{username}")
async def get_pokemons_svg(
username: str = Depends(get_username),
…
…
데이터베이스에 있는 유저 값에 대해선 원래 있던 유저는 전부 lowercase로 수정하고,
중복 값들에 대해선 먼저 생성된 유저 이외에 다 삭제했다.
'프로그래밍 > Github Pokemon Collection' 카테고리의 다른 글
# 7 진화, 아이템, 프론트, 확장 업데이트 (13) | 2024.09.14 |
---|---|
# 5 봇들아 가라~ 재미없다~ (0) | 2024.07.26 |
# 4 이제는 배경을 넣을때 (1) | 2024.07.13 |
# 3 서버를 고치다 (0) | 2024.07.11 |
# 2 업데이트 했음 (0) | 2024.06.01 |