# 将数据写入到 Supabase

Supabase 是一个开源的后端即服务（Backend as a Service, BaaS）平台，旨在帮助开发者快速构建和部署应用程序，提供实时数据库、用户认证、文件存储等后端能力。

Supabase 以开源形式发布，您可在 [Github](https://github.com/supabase/supabase) 上了解更多项目信息，并参与 Supabase 开源社区的建设与贡献。

本文将介绍如何将 Supabase 连接到 MQTT 服务器，并通过 EMQX Cloud 的数据集成功能，将 MQTT 消息进行解析和转换后写入 Supabase 数据库。

## 准备工作

本节介绍了在 EMQX Cloud 中创建 Supabase 数据集成之前需要做的准备工作。

### 前置准备

在开始之前，请确保您已具备以下基础知识：

- 了解[数据集成](./introduction.md)的基本概念和使用方式
- 了解[规则](./rules.md)的基本原理与配置方法

### 网络设置

为了确保 EMQX Cloud 能够正常访问 Supabase 服务，您需要进入部署管理界面，在**网络管理**中[启用 **NAT 网关**](../vas/nat-gateway.md#在专有版部署中启用-nat-网关)功能。

### 部署 Supabase

Supabase 支持自托管部署和托管云服务部署两种方式。

在本教程中，我们主要介绍 Supabase 的托管云服务部署。如您有自托管部署的需求，可参考 [Supabase 官方文档 - 自托管部署](https://supabase.com/docs/guides/self-hosting)获取更多信息。

1. 访问 [Supabase 控制台](https://supabase.com/dashboard/sign-in)，完成注册并登录。

2. 按照页面指引创建您的 Organization 和 Project。

   ![Supabase Project](_assets/supabase_project.png)

3. 根据实际业务需求创建数据表。本教程以车联网场景为示例，创建一张**车辆实时信息表**，用于存储车辆的经纬度、速度、电量、电机温度以及记录时间等信息。

   ![Table Columns](_assets/supabase_columns.png)

### 获取连接参数

Supabase 提供三种数据库连接方式：

- Direct connection
- Transaction pooler
- Session pooler

其中，Direct connection 在免费计划中仅支持 IPv6 域名，而 EMQX Cloud 当前仅支持 IPv4 域名解析。因此，您可以选择启用 **IPv4 add-on**，或使用 Transaction pooler / Session pooler 等其他连接方式。

本文以 **Session pooler** 为示例。您可以点击 Project 页面顶部的 **Connect** 按钮，查看对应的连接信息，并获取后续创建连接器所需的参数。

![Connection](_assets/supabase_connection.png)

## 创建连接器

在 EMQX Cloud 中，您可以通过 PostgreSQL 连接器访问 Supabase 数据库。

1. 进入部署的数据集成页面，选择 **PostgreSQL**。如果已存在其他连接器，点击**新建连接器**，然后选择 **PostgreSQL**。
2. 根据您获取的连接参数配置连接器，其中**密码**为创建 Supabase Project 时设置的数据库密码。

  ![Supabase Connector](_assets/supabase_connector.png)

3. 如果您想建立加密连接，请点击**启用 TLS** 切换开关。

4. 点击**测试连接**按钮，如果 PostgreSQL 服务能够正常访问，则会返回成功提示。

5. 点击**新建**按钮完成连接器的创建。

## 创建规则

本节演示了如何在 EMQX Cloud 中创建一条规则，用于处理来自 MQTT 主题 `test/vehicle` 的车辆实时数据消息，并通过 PostgreSQL Sink 将解析后的数据写入 Supabase 数据库。

1. 点击连接器列表**操作**列下的新建规则图标或在**规则列表**中点击**新建规则**进入**新建规则**步骤页。

2. 在 SQL 编辑器中输入规则 SQL 如下：

   ```sql
   SELECT
     payload.vehicle_id        AS vehicle_id,
     payload.longitude         AS longitude,
     payload.latitude          AS latitude,
     payload.speed             AS speed,
     payload.battery_level     AS battery_level,
     payload.motor_temperature AS motor_temperature
   FROM
     "test/vehicle"
   ```

   ::: tip

   如果您初次使用 SQL，可以点击 **SQL 示例** 和**启用调试**来学习和测试规则 SQL 的结果。

   :::

3. 点击**下一步**开始创建包含 PostgreSQL Sink 的动作。

4. 从**使用连接器**下拉框中选择已创建好的 PostgreSQL（Supabase）连接器。

5. 在 **SQL 模板** 中填写如下 SQL，用于将解析后的数据写入 Supabase 表中。此处为预处理 SQL，字段不应当包含引号，SQL 末尾不要带分号 `;`：

   ```sql
   INSERT INTO vehicle_realtime_data (
     vehicle_id,
     longitude,
     latitude,
     speed,
     battery_level,
     motor_temperature
   )
   VALUES (
     ${vehicle_id},
     ${longitude},
     ${latitude},
     ${speed},
     ${battery_level},
     ${motor_temperature}
   )
   ```

6. 根据需要配置高级设置选项（可选）。

7. 点击**确认**按钮完成动作的配置。

8. 在弹出的**成功创建规则**提示框中点击**返回规则列表**，从而完成了整个数据集成的配置链路。

9. 在**Flow 设计器**中可以看到已构建完成的数据流：

   ![Flow](_assets/supabase_flow.png)

## 测试规则

推荐使用 [MQTTX](https://mqttx.app/) 模拟车辆数据上报，同时您也可以使用其他任意客户端完成。

1. 使用 MQTTX 连接到部署，向预设主题（以 **test/vehicle** 为例）发布车辆实时数据消息。

  ![MQTTX](_assets/supabase_mqttx.png)

2. 在 Supabase 的 Table Editor 中，可以看到刚刚传入的数据已被添加至表中。

  ![Table Result](_assets/supabase_table_result.png)

## 更多内容

至此，您已完成 Supabase 与 EMQX Cloud 的集成，实现了将 MQTT 服务器发布的消息经过数据转换后写入 Supabase。

如需了解 Supabase 的更多功能，请参考 [Supabase 官方文档](https://supabase.com/docs)。

您也可以访问 [GitHub](https://github.com/emqx/MQTT-Client-Examples)，获取更多不同语言的 MQTT 客户端示例。