Lập trình viên / Tra cứu
Thêm, sửa, xóa bằng SDK
Một request ghi được giới hạn và có transaction; không tự retry khi chưa biết kết quả.
Insert và returning
insert nhận object hoặc mảng tối đa giới hạn mutation (100 dòng). Bỏ cột có default; không gán cột bị cấm. returning cần quyền select với các cột trả về.
const result = await client.from("notes")
.insert({owner_id:user.id,title:"Ghi chú"}).returning("id", "title");
// result: {data:[...], affected, revision, request_id}Update và delete
Bắt buộc filter tường minh. Không dùng limit/order/cursor/include để giới hạn ghi; SDK từ chối các modifier đó. Bộ lọc ghi chỉ dùng cột bảng gốc. Không sửa PK/identity/owner/group trái policy.
const changed = await client.from("notes").filter({id:noteId})
.update({title:"Tiêu đề mới"});
const removed = await client.from("notes").filter({id:noteId}).delete();
// Không returning: data là null, không phải mảng dòng.Thực thi một lần
MutationBuilder là PromiseLike: await builder hoặc builder.execute(). Await lại cùng instance dùng lại Promise. Tạo builder mới là request mới. returning tạo builder mới trước khi bắt đầu; không đổi sau khi request chạy. Đây không phải bảo đảm idempotency qua reload.
Lỗi và thao tác chưa rõ kết quả
Nếu WhyPikError.outcomeUnknown true/data_outcome_unknown, request có thể đã commit. Dùng ID/unique key ổn định và truy vấn đối chiếu trước khi thử lại; không bật retry mutation tự động. Vi phạm FK/unique/quota trả lỗi không commit khi backend xác nhận. Không có upsert, giao dịch nhiều API hoặc ghi không giới hạn. Import trong dashboard có receipt riêng, không áp dụng ngầm cho runtime SDK.