告别手搓!Postgres 一站式测试数据生成方案
Snaplet 是一个一站式开发者工具,用来生成还原真实生产环境的数据。
在开发过程中,为了提高研发效率,开发者自然希望可以使用和生产环境类似的数据进行测试。这其中就面临不少的挑战:
数据隐私问题。
如何从生产数据中进行取样。因为数据是关联的,所以还要获取关联的数据。
保证数据的保鲜度。因为生产环境的数据一直在变化,一周前从生产环境拉的数据可能就已经过时了。
解决这些挑战需要设计灵活合理的工作流,并且因为是针对开发阶段的,所以开发者体验就显得很重要。Snaplet 就是针对这些目标进行设计的一款解决方案。
核心流程
Snaplet 核心交互是 CLI,使用前端技术栈实现。Snaplet 同时配有 Cloud,用于托管处理过的数据库快照。大致的流程分为三步:
从生产环境的数据库生产快照。
对快照进行处理,处理有三个子步骤:
Select。只选取需要的数据库/表,比如 log 表这种就可以一开始剔除。
Transform。把生产的数据内容进行变换,比如对字段进行脱敏。
Subset。过滤掉不需要的数据,比如只采样 1%。
通过 CLI 把处理后数据库快照恢复到测试数据库。
因为如何变换生产数据库数据是五花八门的,所以 Snaplet 是通过让用户写 JS/TS 代码的方式来完成的。
Snaplet 同时提供了生成 seed 数据的功能。Snaplet 会根据用户的数据库 schema,自动生成操作数据变换的客户端。然后让用户写 JS/TS 来指定需要生成这样的 seed 数据。
内部实现
执行命令行看一下 Snaplet 生成的快照: $SNAPLET_SOURCE_DATABASE_URL='postgresql://postgres:postgres@localhost:5432/postgres' npx snaplet snapshot capture /tmp/snapshot_1
从生成的结构看,有 structure.json / summary.json 这样的 manifest 文件。schema 保存在 schemas.sql。而每个表的数据则以单独的 CSV 文件格式保存。
看一下 Snaplet 的依赖,不出所料,用的是 Faker,就是去年一气之下被作者删库的主角。
总结
Snaplet 的亮点在于集成。一方面是和基于 Git 的研发流程集成 (GitOps),可以和分支,PR, CI/CD 这些集成。另一方面是和各种云服务的集成,比如 AWS S3,GitHub Action,Neon,Prisma,Supabase 这些。Snaplet 体现了典型硅谷开发者工具公司的风格,专注于一个细分领域。目前社区期待 Snaplet 可以尽快支持 MySQL,当然如果已经是 Postgres 党,那就可以立马上车,品味公司之选。