PocketBase: Small but mighty backend in a single file
我需要一个存储一些配置的服务,这些配置会动态的被修改。可以使用本地文件来存储这些配置,但并发写会有问题,可以用建议性文件锁解决并发写的问题,但感觉操作有点麻烦。于是尝试用mysql,由于机器无法联网,安装过程颇为麻烦。于是考虑有没有更简单的替代方案,就找到了 PocketBase。
PocketBase封装了SQLite,增加了一些权限管理等功能,并对外提供web服务。因为其由Go实现,所以很容易就实现了“in 1 file”,只需要一个可执行程序即可使用,且不依赖其他动态库,非常方便。
下载下来pocketbase后,./pocketbase serve --dev
即可在当前目录启动服务,“–dev”选项用于输出更多日志和sql语句,初次启动时需要点击控制台输出的链接来设置超级用户。
控制台的输出中会展示Dashboard和API的url:
Server started at http://127.0.0.1:8090
├─ REST API: http://127.0.0.1:8090/api/
└─ Dashboard: http://127.0.0.1:8090/_/
接下来我会创建一个表(collection)来存储配置,并用脚本查询配置。
登陆Dashboard,点击“+ New collection”,在弹出的界面中配置表的信息,“API Rules”中点击小锁可以设置访问规则,rule留空开启匿名访问。这里假设创建了名为test的表,有一个类型为字符串名为value的字段。
表的主键名字固定为id,如果要查询id为zxq8i98d55e07xt的记录,只要 curl http://127.0.0.1:8090/api/collections/test/records/zxq8i98d55e07xt
,结果可能类似:
{“collectionId”:“pbc_4285667772”,“collectionName”:“test”,“created”:“2025-03-19 03:32:33.533Z”,“id”:“zxq8i98d55e07xt”,“updated”:“2025-03-20 08:23:31.815Z”,“value”:“aaa”}
jq 是一个用于解析json的命令,于是可以创建一个脚本来方便的获取test表的指定记录了:
#!/bin/bash
if [ $# -ne 2 ];then echo "usage: $0 name field"exit 1
fi
res=`curl -s http://127.0.0.1:8090/api/collections/test/records/$1 | jq ".$2"`
if [ "$res" = 'null' ];then echoexit 1
fi
echo ${res:1:-2} #去除首尾字符
用php实现相同功能:
<?php
function query_filed($name, $field) {$url = 'http://127.0.0.1:8090/api/collections/test/records/' . $name;$res = file_get_contents($url);if($res === false) return '';$data = json_decode($res, true);if($data === null) return '';return $data[$field];
}
?>
PocketBase不能直接执行sql语句,可以通过其他工具,比如 sqlite-web 直接读取SQLite的数据库文件。
PocketBase创建的SQLite数据库文件为 pb_data/data.db,通过 pip install sqlite-web
安装sqlite-web后,执行 sqlite_web /path/to/database.db
即可。