Supabase-jsでのDB操作と、Postgre functionの実行
SupabaseのJS SDKの使い方を調べた結果を共有します。データの取得は、SQLのfromとselectを組み合わせて行います。全てのデータを取得する場合はfromでテーブル名を指定し、selectを呼び出します。特定のカラムだけ取得する場合は、selectの第一引数にカラム名を指定します。また、SupabaseのSDKからPostgreSQLの関数を呼び出すこともできます。関数の実行結果はrpc()メソッドで取得できます。ベクトル検索を行う場合は、配列の長さに注意する必要があります。詳細は公式ドキュメントを参照してください。
広告ここから
広告ここまで
目次
Supabaseを触り始めたので、JS SDKの使い方などを調べてみました。
データの取得は、from
とselect
を使う
SQLをメソッドチェーン的に組み上げるイメージで、SDKを使う様子です。
全てのデータを取得する
全てのデータを取得する場合は、from
でテーブル名を指定してから、select
を引数なしで呼び出します。
await client.from('documents').select()
特定のカラムだけ取り出す
SELECT embedding id
のようなクエリを書きたい場合は、select
の第一引数に書きます。
await client.from('documents').select("embedding, id")
Postgre functionをSDKから呼び出す
LangChainのサンプルで作った関数を動かしてみます。
-- Create a function to search for documents
create function match_documents (
query_embedding vector(1536),
match_count int DEFAULT null,
filter jsonb DEFAULT '{}'
) returns table (
id bigint,
content text,
metadata jsonb,
embedding jsonb,
similarity float
)
language plpgsql
rpc()
の第一引数で呼び出す関数を、第二引数で渡すパラメータを指定します。
const targetVectorString = [0.0055157384,-0.009889425,0.016879791,-0.008615596,-0.030847976,0.00419171, ...] // 長さ1536の配列を、OpenAIやClaudeのEmbedding APIで生成しておく
const privateKey = c.env.SUPABASE_PRIVATE_KEY;
const url = c.env.SUPABASE_URL;
const client = createClient(url, privateKey);
const data = await client.rpc("match_documents", {
query_embedding: targetVectorString
})
console.log(data)
実行すると、関数の実行結果が取得できます。
{
error: null,
data: [
{
id: 3,
content: "What's this?",
metadata: [Object],
embedding: [Array],
similarity: 1
},
{
id: 1,
content: 'Hello world',
metadata: [Object],
embedding: [Array],
similarity: 0.796101617580761
},
{
id: 2,
content: 'Bye bye',
metadata: [Object],
embedding: [Array],
similarity: 0.789771054955852
}
],
count: null,
status: 200,
statusText: 'OK'
}
ベクトル検索系については、Dimensions(配列)の長さが足りないとエラーになるのでご注意ください。
{
"error": {
"code": "22000",
"details": null,
"hint": null,
"message": "different vector dimensions 1536 and 6"
},
"data": null,
"count": null,
"status": 400,
"statusText": "Bad Request"
}