일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 내일배움캠프
- nextjs
- deep dive
- 모던 자바스크립트
- CORS
- domain
- 소셜 로그인
- useRouter
- 티스토리챌린지
- error
- React
- Next
- 자주 까먹는
- 구글 로그인
- vscode
- 스파르타코딩클럽
- 프로젝트 셋팅
- 코테
- 코딩테스트
- vercel
- 프로그래머스
- 오블완
- 초기셋팅
- 코드카타
- js
- 리터럴
- 모던자바스크립트
- 셋팅
- git
- array정적메서드
- Today
- Total
파피루스
[supabase] 여러 개 테이블 select하기 (table join) 본문
워낙에 쓰기 간편하게!에 중점을 뒀던건지, 역시 커스텀하려고 하니 직접 짜는 쿼리만큼의 자유도는 없다.
table join 필수 조건
: 조인하려는 테이블 간에 FK가 걸려있을 것
Query (in Next/React/ts)
구문
const { data } = await supabase
.from("테이블이름")
.select("컬럼명나열 or 와일드카드, 조인하려는테이블명(조인테이블의컬럼))
사용 예시
const { data } = await supabase
.from("posts")
.select(`*, comments (content)`)
const { data } = await supabase
.from("posts")
.select("*, users: author_id(*)")
만약 위처럼 했는데 에러가 나면 아래 내용을 참고
내가 원했던 것
1. TABLE.posts + TABLE. user.profile 조인하기
2. TABLE.comments + TABLE.user.pfile 조회하기
문제 상황
요약
1. table join은 조인하려는 테이블 간에 FK가 걸려있어야 한다.
2. Auth.user.id 와 TABLE.users.id 는 같은 uuid + FK가 걸려있는 상태이지만, 실제 내부데이터는 다른 것인지 FK 단순 변경은 불가하다.
부가 설명
문제 1. table join은 조인하려는 테이블 간에 FK가 걸려있어야 한다.
supabase에서 제공하는 Auth, 사용자 정보는 table 제공되지 않아, 프로필 이미지를 저장하기 위해 user 테이블을 생성해 Auth.userId만 조인해서 사용중이였다. 다만, 다른 테이블(posts, comments)에 걸려있는 사용자 아이디도 Auth의 userId를 조인해서 사용 중이였는데 이것이 문제였다.
따라서, FK 연결을 각 테이블 끼리 하도록 변경하자
FK 연결 변경 전후의 연결을 다이어그램으로 나타내면 아래와 같다.
변경 전 | 변경 후 |
posts, users 사이의 직접적으로 연결된 FK가 없다. -> supabase join 불가 |
auth.user이 아닌 table.user와 FK 연결로 변경 |
문제 2. Auth.user.id 와 TABLE.users.id 는 같은 uuid + FK가 걸려있는 상태이지만, 실제 내부데이터는 다른 것인지 FK 단순 변경은 불가하다.
에러 메세지 : insert or update on table "comments" violates foreign key constraint "comments_author_id_fkey"
FK를 변경하려고 하면 위와 같은 에러가 발생했다. 분명 Auth.user.id 와 TABLE.users.id 는 FK가 걸려있으니 같은 값이 들어있을 거라고 당연하게 생각했다. 하지만 에러 내용을 봤을 때는 FK 제약조건 위반이라니!
해결을 위해 시도해본 것
1) 이후 교체할 nullable 한 컬럼 author_id2을 생성 > FK를 걸기 > 데이터 마이그레이션 [실패] > author_id 컬럼 삭제 > author_id2 이름을 author_id로 변경
데이터 마이그레이션에서 실패했다. author_id에 들어가 있는 값을 넣으니 위와 같은 에러가 다시 뜨면서 업데이트가 되지 않았다.
2) 테스트용 신규 테이블을 만들어 빈 테이블에 FK를 걸어보고 데이터를 넣어보자 [성공]
그래서 기존에 있던 데이터를 모두 삭제 한 후 시도하니 정상적으로 들어가는 것을 확인했다.
(개발 단계이기에 테스트 데이터라 가능했던 것이고, 프로덕션이였으면 불가능)
위와 같은 시도를 통해, auth.user.id 와 table.user.id 는 FK 도 걸려있고 보기엔 두 컬럼이 같은 값을 가지고 있는 것처럼 보이지만, 실제 내부 데이터는 다르며 똑같이 보이도록 supabase 자체적으로 처리한 것이 아닐까 하는 의심했다.
우선 2번으로 해결이 가능하니.. auth와의 FK 연결은 최대한 하지말자
'Today I Learned > in dev' 카테고리의 다른 글
[supabase] type 자동 추론하기 (0) | 2024.07.31 |
---|---|
[팀플] 다시는 error/warning 메세지를 무시하지 말아라 (1) | 2024.07.14 |
NextRouter was not mounted. https://nextjs.org/docs/messages/next-router-not-mounted (0) | 2024.07.08 |
[vercel 배포] localhost, vercel 둘 다 쓰고 싶어요 (feat. domain/host 셋팅) (1) | 2024.07.05 |
[vercel] 배포했더니 CORS가 난다 (next/node/vercel) (0) | 2024.07.05 |