你将构建: 一个从你自己的 Postgres 数据库读取的产品列表,带有一个随输入实时筛选的搜索框
请先阅读: 显示 API 数据
在本教程中,你将连接一个 Postgres 数据库(例如 Neon 或 Supabase 上的数据库),编写带参数的 SQL 查询,并用搜索框为这个参数提供值,让列表随访客输入实时筛选。你需要一个可以从互联网访问的 Postgres 数据库,以及一个有读取权限的用户。
准备一张表
创建示例数据
如果你还没有要展示的表,打开数据库服务商的 SQL 编辑器并运行:
sqlcreate table products (id serial primary key, name text not null, price numeric(8, 2) not null); insert into products (name, price) values ('Canvas tote', 24.00), ('Ceramic mug', 14.50), ('Linen apron', 32.00), ('Notebook', 9.90), ('Oak coaster set', 18.00), ('Wool blanket', 89.00);找到连接信息
在服务商的仪表盘中,打开数据库的连接信息(在 Neon 和 Supabase 中,点击项目上的 Connect)。复制主机、端口、数据库名、用户名和密码。它们就是
postgresql://user:password@host:5432/database这类连接字符串的各个部分。
连接数据库
添加 PostgreSQL 集成
从左侧边栏底部打开 Data 工作区。在 Integrations 旁点击 +,选择 PostgreSQL。命名为
Shop database。填写连接信息
在 Connection 卡片中,输入 Host(例如
ep-cool-name.us-east-2.aws.neon.tech)、Port(通常为5432)、Database 和 User。保持 Ssl 为require,或选择verify-full以同时校验服务器证书。添加密码
在 Secrets 卡片中,输入数据库用户的 Password。它在服务端加密保存,不会再次显示。
创建并测试
点击 Create integration,然后在 Test connection 卡片中点击 Run test。显示 Connected 表示 Malla 已连上数据库并运行了一条简单查询。出错时会显示错误信息和代码,例如密码错误或主机无响应。
Shop database 集成列在 Integrations 下,测试结果为 Connected。
查询这张表
查看所有表
在 Queries 旁点击 +,把查询重命名为
products。在 Source 中,把 Integration 设为Shop database,Operation 设为 List tables,然后在 Result 卡片中点击 Run。你会看到该用户可读取的所有表及其列。编写 SQL
把 Operation 设为 Query。在 Sql 中写入:
sqlselect id, name, price from products where name ilike '%' || $1 || '%' order by name$1是一个占位符。它的值来自 Params,从不来自 SQL 文本,所以访客无法借此注入 SQL。给参数一个值
在 Params 下点击 Add item,输入带引号的
"mug":每一项接受一个 JSON 值,所以文本需要引号,数字不需要。Max rows 留空时返回 200 行,最多 1000 行。返回数据行
查询返回一个包含
rows、rowCount、columns和truncated的对象。在 When it runs 中,把 Response path 设为rows,让查询只返回列表。点击 Run:结果是一个产品,即陶瓷马克杯。
添加实时搜索
创建搜索变量
在 Page variables 旁点击 +,选择 String。把它重命名为
search,默认值留空。用变量为参数提供值
选中
products查询。在 Params 下"mug"一项旁,点击 Use an expression(ƒ 按钮),把值替换为vars.search。在 When it runs 中选择 Client。查询现在会在浏览器中于加载时运行,并在
vars.search每次变化时再次运行。Debounce (ms) 会等到访客停止输入后再运行;默认为 250 ms。浏览器请求 Malla 来运行查询,所以密码永远不会离开服务端。添加搜索框
回到画布,在 Layers 标签页中点击 +,选择 Input。在 Field 分区中,把 Placeholder 设为
Search products,把 Value 设为search。现在在输入框中打字就会写入这个变量。列出产品
在搜索框下方插入一个 Collection list。在 Collection list 中,把 Source 设为 Expression,Items 设为
queries.products.data。在 Item 内添加两段文本,并在 Typography 中把它们分别绑定到item.name和item.price。把 Empty text 设为No products match your search.。
由于搜索为空,画布列出了全部六个产品。
试试搜索
按 ⌘↵ 预览页面,在搜索框中输入
oa。稍等片刻,列表只显示杯垫套装。输入xyz查看空状态文字。再按一次 ⌘↵ 回到编辑状态。发布
点击 Publish 并打开预发布页面。搜索对访客同样有效。
你的页面从你自己的数据库读取产品,并随访客输入实时筛选。
你学到了什么
- PostgreSQL 集成保存主机、数据库和用户,并在服务端加密保存密码。
$1、$2占位符从 Params 获取值,参数可以读取变量。- 客户端查询会在其读取的变量变化时重新获取数据,从而把输入框变成实时搜索。
阅读本教程背后的指南: