在 Supabase 中,RPC(Remote Procedure Call,远程过程调用)是一种允许你直接调用 PostgreSQL 数据库中的函数的机制。通过 RPC,你可以在 Supabase 中执行自定义的数据库函数,并将结果返回给客户端。这对于执行复杂的数据库操作或封装业务逻辑非常有用。

1. RPC 的基本概念

RPC 允许你调用 PostgreSQL 中定义的函数(存储过程)。这些函数可以用 SQL 或 PL/pgSQL 编写,并且可以接受参数、执行复杂的查询或操作,并返回结果。

2. 如何在 Supabase 中使用 RPC

在 Supabase 中,你可以通过 supabase-js 客户端库或直接通过 HTTP API 来调用 RPC。

2.1 创建 PostgreSQL 函数

首先,你需要在 PostgreSQL 中定义一个函数。例如,假设我们有一个简单的函数 add_numbers,它接受两个整数并返回它们的和:

1
2
3
4
5
6
CREATE OR REPLACE FUNCTION add_numbers(a integer, b integer)
RETURNS integer AS $$
BEGIN
    RETURN a + b;
END;
$$ LANGUAGE plpgsql;

2.2 通过 supabase-js 调用 RPC

在 JavaScript 或 TypeScript 中,你可以使用 supabase-js 客户端库来调用这个函数:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import { createClient } from '@supabase/supabase-js';

const supabase = createClient('https://your-supabase-url.supabase.co', 'your-anon-key');

async function callRpc() {
    const { data, error } = await supabase
        .rpc('add_numbers', { a: 1, b: 2 });

    if (error) {
        console.error('Error calling RPC:', error);
    } else {
        console.log('Result:', data); // 输出: 3
    }
}

callRpc();

2.3 通过 HTTP API 调用 RPC

你也可以直接通过 HTTP API 调用 RPC。使用 POST 请求到 /rpc/{function_name} 端点,并传递参数:

1
2
3
4
curl -X POST 'https://your-supabase-url.supabase.co/rest/v1/rpc/add_numbers' \
-H "apikey: your-anon-key" \
-H "Content-Type: application/json" \
-d '{"a": 1, "b": 2}'

3. RPC 的优势

  • 封装业务逻辑:你可以将复杂的业务逻辑封装在数据库函数中,减少客户端的复杂性。
  • 性能优化:通过在数据库层执行操作,可以减少网络往返次数,提高性能。
  • 安全性:通过 RPC 调用函数,可以利用 PostgreSQL 的权限系统来控制谁可以执行哪些操作。

4. 注意事项

  • 权限控制:确保你为 RPC 函数设置了适当的权限,以防止未经授权的访问。
  • 错误处理:在调用 RPC 时,始终处理可能的错误,并确保返回的结果符合预期。
  • 性能考虑:虽然 RPC 可以优化性能,但复杂的函数可能会增加数据库的负载,因此需要合理设计。

5. 总结

RPC 是 Supabase 中一个强大的功能,允许你直接调用 PostgreSQL 数据库中的函数。通过 RPC,你可以将业务逻辑封装在数据库层,提高应用的性能和安全性。无论是通过 supabase-js 还是 HTTP API,调用 RPC 都非常简单且灵活。