Flutter for OpenHarmony:postgrest 直接访问 PostgreSQL 数据库的 RESTful 客户端(Supabase 核心驱动) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:postgrest 直接访问 PostgreSQL 数据库的 RESTful 客户端(Supabase 核心驱动) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

请添加图片描述

前言

如果你不想写复杂的 Java/Node.js 后端服务,只想直接增删改查数据库,PostgREST 是一个神奇的后端工具 —— 它能把从 PostgreSQL 数据库自动生成一套 RESTful API。而 postgrest (Dart库) 正是这一服务的官方客户端。

这也是 Supabase(Firebase 的开源替代品)的核心组件之一。通过它,你可以在 Flutter App 中像写 SQL 一样流畅地操作远程数据,既安全又高效。

一、概念介绍/原理解析

1.1 基础概念

  • Filter: eq('id', 1), gt('age', 18) 等,对应 SQL 的 WHERE
  • Select: 指定返回字段,支持关联查询(如 *, posts(*))。
  • Order: 排序规则。
  • RPC: 调用存储过程(Stored Procedures)。

HTTP 请求

SQL 语句

结果集

JSON 数据

Flutter 移动应用

PostgREST 接口网关

后台数据库

1.2 进阶概念

虽然看起来是直连数据库,但实际上通过 PostgREST 的 RLS (Row Level Security) 机制,你可以非常精细地控制每个用户只能读写自己的数据,无需担心越权。

二、核心 API/组件详解

2.1 基础用法

查询数据。

import'package:postgrest/postgrest.dart';final client =PostgrestClient('https://your-project.supabase.co/rest/v1');voidmain()async{// SELECT * FROM countries WHERE name = 'China'final data =await client .from('countries').select().eq('name','China');print(data);// List<Map<String, dynamic>>}
在这里插入图片描述

2.2 插入与更新

// INSERT INTO users (name, status) VALUES ('Tom', 'active')await client.from('users').insert({'name':'Tom','status':'active'});// UPDATE users SET status = 'inactive' WHERE id = 1await client.from('users').update({'status':'inactive'}).eq('id',1);
在这里插入图片描述

三、常见应用场景

3.1 场景 1:无后端 App

基于 Supabase 或自建 PostgREST,直接开发 CMS 或简单的社交应用。

// 获取文章列表及作者信息final posts =await client.from('posts').select('*, author:users(*)');
在这里插入图片描述

3.2 场景 2:实时排行榜

虽然 postgrest 主要是 REST,但结合 Realtime 功能(Supabase),可实现实时数据同步。

// 仅使用 postgrest 获取快照final top10 =await client.from('scores').select().order('score', ascending:false).limit(10);
在这里插入图片描述

3.3 场景 3:调用复杂业务逻辑

通过 RPC 调用数据库函数。

// 调用名为 "reset_password" 的函数await client.rpc('reset_password', params:{'email':'[email protected]'});
在这里插入图片描述

四、OpenHarmony 平台适配

4.1 网络请求库

postgrest 内部默认使用 http 库。在 OpenHarmony 上,这完全没问题。如果你需要自定义(比如加 Token 拦截器或使用 Dio),可以通过构造函数传入自定义 Client。

4.2 权限声明

同样别忘了在鸿蒙 config.json/module.json5 中声明 ohos.permission.INTERNET

五、完整示例代码

本示例列出所有任务 (Todos),并支持点击切换完成状态。

import'package:flutter/material.dart';import'package:postgrest/postgrest.dart';// 请替换为你自己的 PostgREST 服务地址constString _url ='https://my-project.supabase.co/rest/v1';constString _anonKey ='your-anon-key';// 如果有的话voidmain(){runApp(constMaterialApp(home:TodoPage()));}classTodoPageextendsStatefulWidget{constTodoPage({super.key});@overrideState<TodoPage>createState()=>_TodoPageState();}class _TodoPageState extendsState<TodoPage>{ late finalPostgrestClient _client;List<Map<String,dynamic>> _todos =[]; bool _loading =true;@overridevoidinitState(){super.initState(); _client =PostgrestClient( _url, headers:{'apikey': _anonKey},// 公钥);_fetchTodos();}Future<void>_fetchTodos()async{try{final res =await _client.from('todos').select().order('id');setState((){ _todos =List<Map<String,dynamic>>.from(res asList); _loading =false;});}catch(e){print('Error: $e');setState(()=> _loading =false);}}Future<void>_toggle(int id, bool current)async{// 乐观更新 UIfinal index = _todos.indexWhere((t)=> t['id']== id);if(index !=-1){setState((){ _todos[index]['is_complete']=!current;});}try{await _client.from('todos').update({'is_complete':!current}).eq('id', id);}catch(e){// 失败回滚..._fetchTodos();}}@overrideWidgetbuild(BuildContext context){returnScaffold( appBar:AppBar(title:constText('PostgREST Todos')), body: _loading ?constCenter(child:CircularProgressIndicator()):ListView.builder( itemCount: _todos.length, itemBuilder:(context, index){final todo = _todos[index];final isDone = todo['is_complete']as bool???false;returnCheckboxListTile( title:Text(todo['task']asString), value: isDone, onChanged:(_)=>_toggle(todo['id']as int, isDone),);},), floatingActionButton:FloatingActionButton( onPressed: _fetchTodos, child:constIcon(Icons.refresh),),);}}
在这里插入图片描述

六、总结

postgrest 极大地降低了全栈开发的门槛。前端开发者只需专注于 UI 和数据查询,复杂的后端逻辑交给强大的 PostgreSQL 数据库去处理。

最佳实践

  1. 安全性:永远不要在客户端使用 service_role 密钥(超级管理员权限)。始终使用 anon 密钥配合 RLS。
  2. 类型生成:手动解析 Map<String, dynamic> 很累且容易出错,建议使用 supabase_flutter 配合代码生成工具。

Read more

工业互联网CPS系统是一套前端基于Vue2.6,后端基于.NetCore3.1,前后端分离

工业互联网CPS系统是一套前端基于Vue2.6,后端基于.NetCore3.1,前后端分离

工业互联网CPS系统是一套前端基于Vue2.6,后端基于.NetCore3.1,前后端分离,支持跨平台、支持多租户、多语言、多数据库的平台型应用软件。 它涵盖了工业4.0领域主流的业务需求,如MES、WMS、SRM、EMS、QMS、Scada等。 本人深耕工业4.0领域多年,对传统实体企业数字化转型有着丰富的经验,本着自身扎实的技术,过硬的业务能力,开发了这套平台,希望可以帮助更多的企业早日实现工业转型改造。 引言 WMSCloud 是一套面向工业互联网场景的仓库管理系统(WMS),其核心为 CPS(Cyber-Physical Systems,信息物理系统)平台。该系统采用现代化的前后端分离架构:前端基于 Vue 2.6,后端基于 .NET Core 3.1,具备良好的跨平台能力与多租户支持。本文将从系统整体架构出发,深入剖析其关键模块设计与核心技术实现,帮助开发者和技术决策者快速掌握系统能力边界与扩展潜力。 一、

By Ne0inhk

RVC语音转换WebUI完整指南:从零开始掌握AI声音转换技术

RVC语音转换WebUI完整指南:从零开始掌握AI声音转换技术 【免费下载链接】rvc-webuiliujing04/Retrieval-based-Voice-Conversion-WebUI reconstruction project 项目地址: https://gitcode.com/gh_mirrors/rv/rvc-webui RVC-WebUI是一款基于检索式语音转换技术的开源工具,通过直观的网页界面让普通用户也能轻松实现高质量的声音学习和转换。无论你是想体验不同声线的魅力,还是需要将语音内容转换为特定人物的声音,这个工具都能为你提供专业级的解决方案。 🚀 快速入门:环境搭建与首次启动 系统要求检查清单 在开始之前,请确保你的设备满足以下基本要求: 组件最低配置推荐配置操作系统Windows 10 / Ubuntu 18.04Windows 11 / Ubuntu 20.04+处理器4核CPU8核CPU及以上内存8GB16GB+显卡集成显卡NVIDIA GPU(4GB+显存)存储空间10GB可用空间20GB+可用空间 三步完成安装部署 第一步:

By Ne0inhk
cpolar让 OpenWebUI打造的本地 AI模型秒变随身生产力工具

cpolar让 OpenWebUI打造的本地 AI模型秒变随身生产力工具

OpenWebUI 作为一款开源的本地 AI 模型管理工具,核心功能覆盖了可视化交互、多模型切换、私人知识库搭建等,适配设计师、学生、小团队办公人员等各类人群,其优点在于将原本复杂的命令行操作转化为类微信的聊天界面,数据本地存储保障隐私,还能灵活对接本地 Ollama 模型和云端 API。比如设计师可通过它调取本地知识库的素材,学生能用小模型试写论文再切换大模型润色,小团队则能通过多用户权限管理避免参数混乱,整体操作门槛低,新手也能快速上手。 使用 OpenWebUI 时也有一些小细节需要注意,比如部署时要确保 Python 版本为 3.11,否则易出现兼容性问题;对接本地 Ollama 模型时,需先完成 Ollama 的安装和服务启动,才能让 OpenWebUI 自动识别模型;另外上传知识库文档时,建议先整理文档格式,能提升 AI 读取和回答的精准度。 但仅靠 OpenWebUI 在局域网内使用,会遇到不少实际问题:比如设计师出差想调取家里电脑的 AI

By Ne0inhk
OPC转Web API服务器框架源码:集成IoT的C#高性能高并发服务器服务带手机app测试d...

OPC转Web API服务器框架源码:集成IoT的C#高性能高并发服务器服务带手机app测试d...

OPC转web API服务器框架源码。 集成iot,web api服务,这套带码是通过C#编写集成IOCP高性能高并发优势服务器服务源码。 带手机app测试demo源码 具体具备功能如下: 1、具备EF6+mssql数据库功能,可更改为MYSQL或SQLITe. 2、自带WEB API服务,抛弃IIS支持。 用户可以通过WEB前端直接读取远程设备数据以及下发控制指令。 WEB API功能有服务器日志查询、WEB API接口认证用户管理、远端设备注册管理、服务器轮询读取任务启停、服务器参数设置、查询历史数据记录、下发指令到终端设备。 3、系统目前支持modbus 、modbus rtu协议,可定制开发集成Modbus TCp、西门子PLC S7协议、OPC协议、三菱PLC协议以及集成MQTT服务(以上协议在框架中没有集成,可以定制集成)。 4、系统自带MVC服务,开发API像平常使用的一样方便。 另外它自带硬件协议驱动。 5、与传统协议方法不同,比如Modbus设备,需要PC端主动去连接设备,而这套框架只需要监听端口,服务器就能自动去轮询终端所有设备。 6、

By Ne0inhk