조인할 데이터가 없어도 불러오는 쿼리

Today I Learned 날짜 2024년 12월 5일 목요일 내용 버그 대폭발 아임리포트의 버그가 대폭발했다. 데이터 업데이트가 미친듯이 오래걸리기 시작해서, 제한시간인 6시간이 넘어가며 실패처리 되는 걸로 파악했다. 네이버에서 안준다고 못박아버리는 바람에, 우선은 “-”로 저장하도록 로직을 바꿔줬다. 이제 삭제된 키워드가 많더라도 하루만 고생하면 그 이후에는 요청이 오래 걸릴 일이 없다. 슈퍼어드민에서 유저를 불러올 때 일부 데이터가 안불러와진다.. 아마 온갖 데이터를 다 조인하는 과정에서 연관데이터가 없는 경우 누락된 듯하다. 쿼리를 수정해줬다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # 기존 쿼리 stmt = ( select(models.User) .outerjoin(models.User.company) .options(joinedload(models.User.billing_plan)) .options(joinedload(models.User.google_login_account)) .options(joinedload(models.User.super_admin_memo)) ) db.execute(stmt).scalars().all() # 수정 쿼리 stmt = ( select(models.User) .outerjoin(models.User.company) .options(contains_eager(models.User.company)) .options(joinedload(models.User.billing_plan)) .options(joinedload(models.User.google_login_account)) .options(joinedload(models.User.super_admin_memo)) ) db.execute(stmt).unique().scalars().all() 회고 버그야 제발 ...

2024년 12월 5일 · 1 분 · 배준수

쿼리문에서 또는 사용법

Today I Learned 날짜 2024년 7월 26일 금요일 내용 또 이슈.. 또 이슈가 터졌다. 우리 프로덕트 리뷰 기능에는 구글 검색에 나타나는 제품 스니펫을 추가해주는 기능이 있다. 제대로 들어갔는지는 링크에서 확인해보면 되는데, aggregateRating과 리뷰가 없다고 결과가 나온다. 스니펫이 없다거나, 스니펫에 들어갈 데이터가 상품 메타필드에 없거나 하는 문제가 있을까 싶어 열심히 찾아봤는데 다 있다. 그럼 도대체 어디가 문제인가… 비정상을 찾는 최고의 방법은 정상과 비교해보는 법. 우리 서비스를 이용하는 다른 샵들의 대시보드로 들어가서 구글 스니펫을 사용하는 샵들도 테스트를 돌려봤다. 근데 다 똑같은 오류가 뜬다..? 그럼 둘 중 하나다. 저게 뜨는게 정상적인 상태였거나, 애초에 기능 자체가 고장나버린 상태거나.. 월요일에 도움을 받아 다시 봐야 겠다. 혹시나해서 구글에 검색해봤는데 역시나 리뷰 갯수나 평점 등의 스니펫은 안뜨긴 한다. 아마 고장났나보다… ...

2024년 7월 26일 · 2 분 · 배준수

쿼리문에 join이 필요한 경우

Today I Learned 날짜 2024년 2월 19일 월요일 내용 SQL 쿼리문에서 Join 그동안 쿼라를 이용해 관계(relationship)를 맺고 있는 여러 데이터를 가져올때 joinedload를 사용했다. 예를 들어, shop_detail 테이블에 있는 필드 use_ai는 우리 서비스에서 AI 기능을 사용하는 지를 나타낸다. id가 shop_id로 일치하는 Shop을 불러올 때, shop_detail도 같이 가져오기 위해 쿼리문을 다음과 같이 작성할 수 있다. 1 2 stmt = select(models.Shop).options(joinedload(models.Shop.shop_detail).where(models.Shop.id == shop_id) result = db.execute(stmt).scalar_one_or_none() 이 떄, result는 [models.Shop](http://models.Shop) 형식이겠지만, shop_detail을 참조할 수 있다. print(result.shop_detail.use_review)와 같은 형식으로! ...

2024년 2월 19일 · 1 분 · 배준수

SQL은 어려워

Today I Learned 날짜 2023년 12월 19일 화요일 내용 너무 힘들다. 흑흑 SQL 데모 로그인은 로그인의 로직을 이용해 만들었다. 로그인 함수가 호출되면, 해당 계정 정보가 관계를 갖고 있는 shop들을 불러와 shops 라는 배열에 담는다. 데모 로그인 때는, 가져온 후 데모로 설정한 shop_id와 일치하는 것만 남기도록 처리하였다. 이 과정이 DB에 영향을 끼치지 않도록 하기 위해, DB에 최근 접근 시간을 업데이트하고 commit하는 이후에 해당 로직을 추가하였다. shop들을 가져와 배열에 담는 joinedload에 특정한 조건을 추가하는 코드를 작성해야 했다. 사실 이 부분에서도 많이 헷갈렸는데, joinedload가 일반 join과 다른 점은 eager loading이라느 것이다. 간단히 말하자면 lazy-loading은 레코드를 조회할 때 연관관계가 있는 데이터들의 조회를 필요한 순간까지 미루는 것이고 eager-loading은 레코드를 조회할 때 연관이 있으면 다 가져와놓는 것이다. 지금 고민하는 부분과는 다른 이야기이니 차치하고, join과는 언제 연관된 데이터를 갖고 오느냐만 다르다는 의미이다. ...

2023년 12월 19일 · 2 분 · 배준수

Document 광신도(RTFM)

Today I Learned 날짜 2023년 11월 8일 수요일 내용 과제 중 백엔드 부분을 완성했다. 기능 설명에 관련된 부분들은 모두 완성하였다. 데이터베이스 테이블 문제 아마 프론트 부분을 구현하면서 약간의 수정만 필요하지 않을까 싶다. 어제 DB에 Table이 생성되지 않아 문제를 겪었는데 생각보다 수월하게 해결되었다. 기존에 model에 작성한 대로 table을 생성하는 코드가 database.py에 위치해 있었는데, 이것을 main.py로 옮기니 바로 해결됐다. 그 위치에서는 그 코드가 작동되지 않았던걸까? 문제는 해결됐지만 어제의 추론들은 주말에 공부해서 스스로 답변을 작성해봐야겠다. ...

2023년 11월 8일 · 2 분 · 배준수