
這是我的表的簡化結構 - 2 個主表,一個關系表。
為此處理插入 API 的最佳方法是什么?如果我只有一個客戶端和 Supabase:
- First API call to insert book and get ID
- Second API call to insert genre and get ID
- Third API call to insert book-genre relation
這是我能想到的,但 3 個 API 呼叫似乎是錯誤的。
有沒有一種方法可以使用來自我的客戶端的單個 API 呼叫插入這 3 個表,就像我可以呼叫的單個 postgres 函式一樣?
請與 API 共享一個通用示例,謝謝!
uj5u.com熱心網友回復:
您是否有任何理由需要通過一次呼叫來執行此操作?我從你的結構中假設你不會genre為你創建的每一本書都創建一個新的,所以大多數時候,你只是插入一個book記錄和一個book_gen_rel記錄。在現實世界中,您可能會擁有屬于多種型別的書籍,因此最終您將更改函式以在一次呼叫中處理插入一本書和多種型別的書籍。
話雖如此,也有兩種方法可以解決這個問題。您可以從客戶端進行多個 API 呼叫(這樣做確實沒有問題——這很常見)。其次,如果您創建一個 PostgreSQL 函式并使用.rpc().
僅使用客戶端呼叫在每個表中插入記錄的示例:
const { data: genre_data, error: genre_error } = await supabase
.from('genre')
.insert([
{ name: 'Technology' }
]);
const genre_id = genre_data[0].id;
const { data: book_data, error: book_error } = await supabase
.from('book')
.insert([
{ name: 'The Joys of PostgreSQL' }
]);
const book_id = book_data[0].id;
const { data: book_genre_rel_data, error: book_genre_rel_error } = await supabase
.from('book_genre_rel_data')
.insert([
{ book_id, genre_id }
]);
這是一次插入 3 個表的單個 SQL 陳述句:
WITH genre AS (
insert into genre (name) values ('horror') returning id
),
book AS (
insert into book (name) values ('my scary book') returning id
)
insert into book_genre_rel (genre_id, book_id)
select genre.id, book.id from genre, book
現在這是一個 PostgreSQL 函式,可以在單個函式呼叫中完成所有操作:
CREATE OR REPLACE FUNCTION public.insert_book_and_genre(book_name text, genre_name text)
RETURNS void language SQL AS
$$
WITH genre AS (
insert into genre (name) values (genre_name) returning id
),
book AS (
insert into book (name) values (book_name) returning id
)
insert into book_genre_rel (genre_id, book_id)
select genre.id, book.id from genre, book
$$
這是一個測驗它的示例:
select insert_book_and_genre('how to win friends by writing good sql', 'self-help')
現在,如果您已經創建了該函式(在 Supabase 查詢編輯器中),那么您可以像這樣從客戶端呼叫它:
const { data, error } = await supabase
.rpc('insert_book_and_genre', {book_name: 'how I became a millionaire at age 3', genre_name: 'lifestyle'})
再一次,我不推薦這種方法,至少不推薦這種方法genre。您應該先插入您的流派(它們可能不會改變)并將其簡化為僅插入一個book和一個book_genre_rel記錄。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/321655.html
標籤:PostgreSQL 超基地 超级数据库
上一篇:檢索元BS4元素的內容
下一篇:每次點擊都能改變背景
