10分钟用 Mathesar 搭建低代码数据管理面板
用 Docker 快速部署 Mathesar,连接 PostgreSQL 数据库,通过可视化界面完成数据查改、筛选、关联查询和表单收集。让非技术队友自主管理数据,摆脱反复跑 SQL 的琐碎工作。

10分钟用 Mathesar 搭建低代码数据管理面板
上周运营又跑来找我:「能不能导出上个月 27 号之后注册的用户列表?只要邮箱和城市。」一行 SQL 的事,但这已经是本月第八次类似请求。
更麻烦的是,有些数据需要运营自己录入。他们没有数据库权限,只能通过我建的内网表单或直接在群里发 Excel,最后我再手动导进去。时间全浪费在来回沟通上。
这篇教程带你用 Mathesar 搭一个开箱即用的数据管理面板。完成之后,你能从零部署到实际使用跑通全流程,运营同事也能直接在浏览器里查数据、录数据、看关联记录,彻底摆脱「人形 SQL 解释器」的角色。
准备环境
开始前确认以下工具就位:
- Docker + Docker Compose:Mathesar 官方推荐的部署方式。Docker 24.x 和 Compose v2.20.3 均可。
- 一个 Postgres 数据库(可选):已有实例可直接连接;没有也没关系,后续用 Docker 一并启动。
- 基本命令行知识:会
cd、docker compose即可,不需要接触 Svelte 或 Django。
⚠️ 为什么强调 Docker?Mathesar 依赖多个服务(Django 后端、Svelte 前端、Nginx 反向代理等),手动配置容易踩坑。Docker Compose 一条命令搞定所有依赖,也是官方首推方式。
Docker Compose 一键部署
第一步:获取官方 docker-compose.yml
在本地创建空目录,拉取 Compose 文件:
bash
mkdir mathesar-demo && cd mathesar-demo
curl -o docker-compose.yml https://raw.githubusercontent.com/mathesar-foundation/mathesar/main/docker-compose.yml
打开文件会看到定义了 postgres、redis、django、nginx 四个服务。重点看对外暴露的端口和数据库连接信息,无需深究每个细节。
第二步:调整端口和数据库密码
默认 Compose 暴露 80 端口。如果本机已有服务占用,改成别的比如 8080。同时修改 Postgres 环境变量密码(默认 mathesar,生产环境建议替换):
bash
sed -i 's/- "80:80"/- "8080:80"/' docker-compose.yml
用编辑器直接改也行。改完后启动服务:
bash
docker compose up -d
docker compose ps
启动需要拉取镜像,等半分钟左右。看到四个容器都 running 说明正常。
💡 数据不经过公网、不走第三方 SaaS,全部在你自己的服务器上。Mathesar 底层直接用 Postgres 的 Role 和 Privilege 做权限控制,后续给同事开账号也只能访问授权部分数据。
第三步:访问并完成初始化
浏览器打开 http://localhost:8080,看到 Mathesar 登录页。首次进入注册管理员账号,按提示填写邮箱和密码。
登录后点击 "Add Database" 连接数据库:
- 使用 docker-compose 自带的 Postgres:Host 填
postgres(Docker 网络内服务名),Port5432,库名mathesar,用户名密码与 Compose 里的POSTGRES_USER/POSTGRES_PASSWORD一致。 - 连接已有数据库:填对应主机、端口、库名和凭据。
连接成功后进入类似电子表格的界面——Mathesar 核心工作区。所有 Postgres 概念(Schema、Table、Column、Constraint)在左侧导航栏里,操作从写 SQL 变成点点鼠标。
实战:搭建客户关系管理面板
用一个完整案例把 Mathesar 用起来:搭建简易 CRM 面板,让运营自主录入客户信息、查记录、看关联数据。
1. 创建数据库结构
左侧 "Schemas" → 选择默认 schema(通常 public)→ "Create Table"。
建 customers 表:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | Integer / Primary Key | 默认自带 |
| name | Text | 客户姓名 |
| 邮箱(Mathesar 提供自定义 Email 类型,自带格式校验) | ||
| city | Text | 城市 |
| signup_date | Date | 注册日期 |
| notes | Text | 备注 |
逐个添加字段,类型直接下拉选。Email 类型会在数据库层面加 CHECK 约束,确保存入合法邮箱——比应用层校验更靠谱,即使绕过 UI 直接操作 DB,数据也不会脏。
2. 录入和筛选数据
切换到 "Table" 视图,看到空白电子表格。点击底部 "+ Add Record" 逐条录入。
录了几条数据后,点击列头漏斗图标筛选,比如 city 为 "杭州" 的记录。Mathesar 自动生成底层 SQL 查询。
💡 Mathesar 底层走的是 Postgres 索引。表建了索引,筛选也会走索引,性能不会差。筛选条件可以保存,随时调用。
3. 建关联表和关系
实际场景里,一个客户对应多个订单。再建 orders 表:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | Integer / Primary Key | - |
| customer_id | Link → customers.id | 外键关联 |
| product_name | Text | 商品名 |
| amount | Money/Currency | 金额 |
| order_date | Date | 下单日期 |
customer_id 选 "Link to another table" 指向 customers 表。底层就是创建 Postgres Foreign Key,Mathesar 用图形化操作代替了 ALTER TABLE ... ADD CONSTRAINT ... FOREIGN KEY ...。
建完关系后打开某条客户记录,页面下方自动列出该客户所有订单。点击订单直接跳转详情页——这种一对多关联的可视化,原生 psql 或 DBeaver 很难做到。
4. 用 Explorer 做数据查询
运营想看「本月各城市的客户数量和消费总额」,用 Mathesar 的 Data Explorer:
- 侧边栏点击 "New Exploration"
- 选择主表
customers - 添加 Join,关联
orders - Group By 选
city - Aggregation 添加 COUNT(id) 和 SUM(amount)
- 点击 "Save" 生成结果视图
像搭积木一样不用写 SQL,最终生成的 SQL 在 Explorer 底部能看到。对照学习 SQL 也是好方式。
5. 建表单收集外部数据
一线销售用手机录入客户信息,用 Form Builder:
- 选中
customers表 → "Create Form" - 勾选要收集的字段(name、email、city),隐藏不需要填写的字段(notes)
- 设置必填/选填
- 保存后 Mathesar 生成公开链接,发给销售
填完的数据直接作为新记录写入 Postgres 表,不需要中间环节、不需要导出导入。表单是响应式的,手机填写体验很好。
常见问题与踩坑提醒
Q1:启动后 8080 端口被占用?
用 lsof -i :8080 或 netstat -tunlp | grep 8080 查占用进程,杀掉或者在 Compose 文件里换别的端口如 8888,记得同时修改映射前后端口 - "8888:80"。
Q2:连不上已有 Postgres?
最常见原因是 Postgres 没配置远程访问。检查 pg_hba.conf 是否允许了应用服务器 IP,postgresql.conf 里 listen_addresses 是否为 '*'。Postgres 也在 Docker 里的话,确保两个容器在同一 Docker network 下。
Q3:数据量大了会不会卡?
Mathesar 本身不存数据,只是 Postgres 的外壳。性能瓶颈在 Postgres 本身。该加的索引加上,该做分表时做分表,Mathesar 会跟着受益。
Q4:能多人协作吗?
可以。Mathesar 的用户权限体系直接映射到 Postgres Roles。UI 设置完角色和权限后,Mathesar 会生成对应 GRANT/REVOKE 语句。给运营设置只能读写的角色,给开发设置能修改 schema 的角色——权限粒度完全和 Postgres 一致。
以下是连接已有 Postgres 时创建只读角色的参考 SQL:
sql
CREATE ROLE ops_readonly LOGIN PASSWORD 'secure_password';
GRANT CONNECT ON DATABASE mydb TO ops_readonly;
GRANT USAGE ON SCHEMA public TO ops_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO ops_readonly;
-- 如需读写权限替换 SELECT 为 ALL PRIVILEGES
-- Mathesar 会复用这些 Role 做 UI 层面的权限控制
总结
整个流程做了四件事:
- 部署:Docker Compose 一键拉起,零手动配置
- 连接:对接现有或新建的 Postgres 数据库
- 建模:用 UI 建表、建字段、建关联关系,底层自动同步到 Postgres
- 使用:表格视图查改数据、Explorer 做聚合查询、Form 收集外部数据
不到半小时,得到一个生产可用的低码数据面板。运营自主查数据、录数据、看关联关系,从「人肉 SQL 机」变成「基础设施维护者」,这才是理想的技术工作状态。
下一步建议:
- 部署到测试环境,用真实数据跑一跑
- 研究官方 Postgres Role 权限配置文档,设置细粒度权限
- 有定制需求的话,Mathesar 是 Django + Svelte 全开源的,直接 fork 代码修改
GitHub:https://github.com/mathesar-foundation/mathesar
官方文档:https://docs.mathesar.org/