๐จ TroubleShotting
๋ฌธ์ ๋ฐ์์ ๋ฐฐ๊ฒฝ - As Is
Supabase์ quiz_like๋ผ๋ ํ ์ด๋ธ์ users๋ผ๋ column์ user_id์ ๋ฐฐ์ด(text[])๋ก ํ์ ์ ์ ํด๋์๋ค.
์ด users๋ผ๋ column์ ํ ๋ฒ์ ํต์ ์ผ๋ก updateํ๊ณ ์ถ์์ผ๋,
๊ธฐ์กด supabase์ update ๋ฉ์๋๋ ๊ธฐ์กด ๊ฑธ ๊ฐ์๋ฐ๊พธ๋ ๋ฉ์๋๋ผ์
๊ธฐ์กด์ ๊ฒ์ select ํ ๋ค update ํ๋ ์ด ๋ ๋ฒ์ ๋คํธ์ํฌ ํต์ ์ด ๋ฐ์ํ๋ค.
๋ด๊ฐ ์ํ ๊ฒ์ ํ๋ฒ์ ํต์ ์ผ๋ก ๊ธฐ์กด ๊ฒ์ ์ถ๊ฐ๋๋๋ก ํ๊ณ ์ถ์ ์์ค์ ๊ตฌ๊ธ์ ์ฐพ์๋ณด๋ ์ด๋ฐ ๊ธ์ด ์์๋ค.
https://github.com/orgs/supabase/discussions/1570
How(๊ณผ์ ) ?
์ํ์ฐฉ์ค 1
๊ทธ๋์ SQL์ ์ด๋ ๊ฒ ์์ฑํด ๋ณด์๋ค.
๊ทธ๋ฐ๋ฐ
{code: "42702", details: "It could refer to either a PL/pgSQL variable or a table column.", hint: null,
message: "column reference \"quiz_id\" is ambiguous" }
๋ผ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
ํจ์์ ๋งค๊ฐ๋ณ์์ vs ํ
์ด๋ธ์ ์นผ๋ผ ์ด๋ฆ์ผ๋ก ๋์์ ์ฌ์ฉ๋์ด ambiguous ํ๋ค๋ ๊ฒ์ด๋ค.
์ํ์ฐฉ์ค 2
๊ทธ๋์ ์ด๋ ๊ฒ ๋ฐ๊ฟจ๋ค.
๋ชจํธํ์ง ์๊ฒ quiz_like ํ
์ด๋ธ์ quiz_id vs ํจ์์ ๋ค์ด์ฌ quiz_id
๋ก ๋ฐ๊ฟจ๋ค.
๊ทธ๋ฐ๋ฐ ๊ทธ๋ฌ๋๋ ์ด๋ฒ์๋
{code: "42601", details: null, hint: null, message: "query has no destination for result data"}
๋ผ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง๋ง, ๊ฒฐ๊ณผ๋ฅผ ์ด๋๋ก ๋ฐํํ ์ง ๋ช
์ํ์ง ์์๋ค๋ ๋ป์ด๋ค.
what(๊ฒฐ๊ณผ) - To Be
๊ทธ๋์ ์ด๋ป๊ฒ ํด์ผํ์ง.. ํ๋ค๊ฐ SQL๋ฌธ์ ์ ๋ชจ๋ฅด๋ ๋ chatGPT์ ๋ฌผ์ด๋ดค๋ค.
chatGPT๊ฐ ๋ด ์ค ๊ฒฐ๊ณผ๋ ์ด๋ฌํ๋ค.
์ด์ ํจ์์ ๋ค๋ฅธ ์
1. 'returns quiz_like' -> 'returns setof quiz_like'
๋จ์ผ ํ์ ๋ฐํํ๋ ค๊ณ ํ์ง๋ง ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ๋ช
์์ ์ผ๋ก ๋ฐํํ์ง ์๋ ๋ถ๋ถ์
quiz_like์ ์ฌ๋ฌ ํ์ ๋ฐํํ๋ค๊ณ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ๋ช
์์ ์ผ๋ก ๋ฐํํ๋๋ก ๋ณ๊ฒฝํ๋ค.
2. update quiz_like -> return query + update quiz_like
ํจ์๋ฅผ ์ ์ํ ๋ ํจ์์ ๊ฒฐ๊ณผ๊ฐ ๋ฌด์์ผ์ง๋ฅผ ๋ช
์ํด์ผ ํ๋๋ฐ
์ด์ SQL๋ฌธ์ ์ ํํ ์ด๋ค ๊ฒฐ๊ณผ๋ฅผ return ํ๋์ง ํจ์๋ฅผ ์ค๋ช
ํ๋ begin ... end์ ์์ฑํ์ง ์์๋ค.
์ ํํ query๋ฅผ return ํ๋ค๋ ๊ฒ์ ๋ช
์ํด์คฌ๋ค.
์ด๋ ๊ฒ ํ๋๋ ์ํ๋ ๋๋ก ๊ธฐ์กด ๋ฐฐ์ด์ ์ถ๊ฐ๋๋๋ก ํ ์ ์์๋ค.
๋ง๋ ํจ์๋ ์ด๋ ๊ฒ ์ฌ์ฉํ๋ค.
const submitQuizLike = async (quiz_id: string, user_id: string) => {
const supabase = clientSupabase();
await supabase.rpc('append_user_id_to_quiz_like', { quiz_id, user_id });
};
๐ก ์๋กญ๊ฒ ์๊ฒ๋ ์
๋จ์ํ GPT์ ๋ฌผ์ด๋ณด๊ณ ๋๋๋ฉด ๋ ๊ธฐ์ ์ ์ ธ๋ฒ๋ฆฐ ์ธ๊ฐ.. ใ
ใ
ํ์คํ์ค ๋ถ์ํด์ ๋ฐฐ์์ผ๊ฒ ๋ค๋ ์๊ฐ์ ์ ๋ฆฌํ๋ค.
- ‘create function append_user_id_to_quiz_like (quiz_id uuid, user_id uuid):
append_user_id_to_quiz_like ๋ผ๋ ํจ์๋ฅผ ๋ง๋๋๋ฐ, ๊ทธ ์ธ์๋ก๋ quiz_id์ user_id ๊ฐ ๋ค์ด๊ฐ๊ณ ๊ฐ๊ฐ์ type์ด uuid๋ค.
- returns setof quiz_like:
์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ก quiz_like์ ์ฌ๋ฌ ํ์ ๋ฐํ
- as $$ ... $$ language plpgsql:
ํจ์ ๋ณธ๋ฌธ์ $$ … $$ ์ฌ์ด์ ๋๋ฌ์์ฌ ์์ผ๋ฉฐ, ํจ์๋ PL/SQL ์ธ์ด๋ก ์์ฑ๋๋ค.
- ‘begin ... end;:
ํจ์ ๋ณธ๋ฌธ์ ์์๊ณผ ๋์ ๋ปํ๋ค.
- ‘return query:
ํจ์์ ๊ฒฐ๊ณผ๋ก ์ฟผ๋ฆฌ๋ฅผ ๋ฐํ
- ‘update quiz_like:
quiz_like ํ
์ด๋ธ์ ์
๋ฐ์ดํธ
- set users = case ... end:
‘users’ ์ปฌ๋ผ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์
๋ฐ์ดํธ ํ ๊ฒ์ด๋ค.
- array_position(users, user_id) is null:
users ์ปฌ๋ผ์์ user_id๊ฐ ์๋์ง ํ์ธ
๋ง์ฝ ์์ผ๋ฉด (null ์ด๋ฉด)
- array_append(coalesce(users, '{}'), user_id)
+) coalesce(users, ‘{}’) : ์ธ์๋ค ์ค์ ์ผ์ชฝ๋ถํฐ ๊ฐ๋ฉด์ null์ด ์๋ ๊ฒ์ ๋ฐํํ๋ ํจ์
์ด๋ฒ์๋ users ๋ฐฐ์ด์ด null์ธ์ง ํ์ธ
null์ด ์๋๋ฉด users๋ฅผ ๋ฐํ, null ์ด๋ฉด ‘{}’์ ๋ฐํํด์ ๊ฒฐ๊ณผ์ ์ผ๋ก๋ ๋น ๋ฐฐ์ด์ ๋ฐํ ํ,
Users๊ฐ null์ด ์๋๋ฉด ๊ธฐ์กด users์ user_id๋ฅผ ์ถ๊ฐํ๊ณ null์ด๋ฉด ๋น ๋ฐฐ์ด์ user_id๋ฅผ ์ถ๊ฐ
- else users:
๊ทผ๋ฐ ๋ง์ฝ users ์ปฌ๋ผ์ user_id๊ฐ ์์ผ๋ฉด ๊ธฐ์กด users ๋ฐฐ์ด์ ๋ฐํ
- where quiz_like.quiz_id = append_user_id_to_quiz_like.quiz_id:
quiz_like ํ
์ด๋ธ์ quiz_id๊ฐ ํจ์์ ์ธ์๋ก ๋ค์ด์ค๋ quiz_id๋ ์ผ์นํ๋ ํ์ ์
๋ฐ์ดํธ ํ ๋์์ผ๋ก ํ๊ฒ ๋ค.
- returning *;:
์
๋ฐ์ดํธ๋ ํ์ ๋ฐํ
๋น๋ก.. GPT์ ์์กดํด์ ์๊ฒ๋ ์ง์์ด์ง๋ง..
๊ทธ๋๋ ๋ชจ๋ฅด๋ ๊ฒ ๋ณด๋ค๋ ์ด๋ ๊ฒ๋ผ๋ ์๋ ๊ฒ ์ด๋๊ฐ!:))