supabaseâ€数据库函数
#javascript #网络开发人员 #开源 #supabase

在本文中,我们将了解supabase数据库函数以及如何从您的应用中调用它们。

supabase数据库函数是PostgreSQL functions,您可以使用Supabase客户端从应用中调用。

数据库功能允许您执行通常会在数据库中单个功能中进行几个查询和往返的操作。

创建一个表

让我们创建一个名为restaurants的新表并向其添加一些数据。

CREATE TABLE restaurants (
  id INT PRIMARY KEY,
  name TEXT NOT NULL,
  description TEXT NOT NULL,
  address TEXT NOT NULL,
  phone_number TEXT NOT NULL,
  email TEXT NOT NULL,
  website TEXT NOT NULL,
  status TEXT NOT NULL
);

在桌子上添加一些餐厅,以便我们可以测试我们的数据库功能。我们将在桌子上增加5家餐厅。

INSERT INTO restaurants (id, name, description, address, phone_number, email, website, status)
VALUES (1, 'Tasty Bites', 'A cozy bistro with a wide range of delicious dishes.', '123 Main St, Cityville', '+1234567890', 'info@tastybites.com', 'www.tastybites.com', 'approved');

INSERT INTO restaurants (id, name, description, address, phone_number, email, website, status)
VALUES (2, 'Sushi Delight', 'Experience the finest sushi in town.', '456 Oak Ave, Urbantown', '+9876543210', 'hello@sushidelight.com', 'www.sushidelight.com', 'approved');

INSERT INTO restaurants (id, name, description, address, phone_number, email, website, status)
VALUES (3, 'Pizza Haven', 'Authentic Italian pizzas made with love.', '789 Pine Rd, Villageland', '+5551234567', 'info@pizzahaven.net', 'www.pizzahaven.net', 'pending');

INSERT INTO restaurants (id, name, description, address, phone_number, email, website, status)
VALUES (4, 'Spice Fusion', 'A fusion of flavors from around the world.', '1010 Spice Blvd, Flavortown', '+1231231234', 'contact@spicefusion.co', 'www.spicefusion.co', 'approved');

INSERT INTO restaurants (id, name, description, address, phone_number, email, website, status)
VALUES (5, 'Café Euphoria', 'A serene café serving premium coffees and pastries.', '222 Serenity Ln, Tranquiltown', '+9879879876', 'info@cafeeuphoria.com', 'www.cafeeuphoria.com', 'rejected');

探索数据库函数语法

这是用于创建数据库函数的基本语法。

CREATE FUNCTION function_name (arguments) RETURNS return_type AS $$
  DECLARE
    -- declare variables
  BEGIN
    -- function body
  END;
$$ LANGUAGE plpgsql;

数据库函数具有以下部分:

  • function_name是函数的名称。
  • arguments是该函数接受的论点。
  • return_type是函数返回的值类型。
  • function body是函数执行的代码。

返回记录的功能

让我们创建一个简单的功能,该功能从restaurants表中返回所有记录。

CREATE OR REPLACE FUNCTION get_restaurants()
  RETURNS SETOF restaurants AS $$
  BEGIN
    RETURN QUERY SELECT * FROM restaurants;
  END;
$$ LANGUAGE plpgsql;

您可以看到get_restaurants函数返回SETOF restaurants。这意味着该函数从restaurants表返回一组记录。

您可以从SQL编辑器或下一个app中调用该功能。

SELECT * FROM get_restaurants();

使用supabase客户端从您的next.js应用程序调用函数。

const { data, error } = await supabase.rpc("get_restaurants");

您也可以使用RETURNS TABLE语法编写相同的功能。

CREATE OR REPLACE FUNCTION get_restaurants_2()
  RETURNS TABLE (
    id INT,
    name TEXT,
    description TEXT,
    address TEXT,
    phone_number TEXT,
    email TEXT,
    website TEXT,
    status TEXT
  ) AS $$
  BEGIN
    RETURN QUERY SELECT * FROM restaurants;
  END;
$$ LANGUAGE plpgsql;

返回特定列的功能

如果要忽略restaurants表中的某些列,则可以通过不将它们包含在RETURNS TABLE语法中,而仅选择要从restaurants表返回的列。

在此示例中,我们仅返回idnameemailwebsite列,从restaurants表。

CREATE OR REPLACE FUNCTION get_restaurants_3()
  RETURNS TABLE (
    id INT,
    name TEXT,
    email TEXT,
    website TEXT
  ) AS $$
  BEGIN
    RETURN QUERY SELECT r.id, r.name, r.email, r.website FROM restaurants r;
  END;
$$ LANGUAGE plpgsql;

返回单个值的函数

您还可以创建一个返回单个值的函数。在此示例中,我们返回restaurants表中的餐厅总数。

CREATE OR REPLACE FUNCTION get_restaurants_count()
  RETURNS INT AS $$
  BEGIN
    RETURN (SELECT COUNT(*) FROM restaurants);
  END;
$$ LANGUAGE plpgsql;

接受参数的功能

您还可以创建一个接受参数的函数。在此示例中,我们创建了一个接受status参数并返回具有该状态的餐厅的函数。

CREATE OR REPLACE FUNCTION get_restaurants_by_status(r_status TEXT)
  RETURNS SETOF restaurants AS $$
  BEGIN
    RETURN QUERY SELECT * FROM restaurants WHERE status = r_status;
  END;
$$ LANGUAGE plpgsql;

您可以使用supabase客户端调用该函数。

const { data, error } = await supabase.rpc("get_restaurants_by_status", {
  r_status: "approved",
});