这是关于使用 Go 和 SQLite 进行编程的笔记,主要内容如下:
- 介绍:作者在 Go Northwest 演讲的博客化版本,探讨作为独立开发者如何将在谷歌团队中的经验应用于编写互联网服务、iOS 应用和 macOS 程序,重点是如何取舍硅谷大公司的工程实践以适应单人开发。决定使用 Go 和 SQLite 两种关键技术。
- SQLite 简介:SQLite 是 SQL 的实现,是自包含的 C 库可嵌入程序,2000 年由 D. Richard Hipp 开发,其他开源贡献者也有参与。通过实际操作展示了使用 SQLite 命令行工具创建数据库、导入 CSV 文件、清理数据以及使用全文搜索等功能。
从 Go 中使用 SQLite:
- 标准
database/sql
:有多个基于 cgo 的 SQLitedatabase/sql
驱动,最流行的是github.com/mattn/go-sqlite3
,使用该包可方便地打开 SQLite 数据库并执行 SQL 语句。 - 低级包装器
crawshaw.io/sqlite
:作者自己编写的包装器,支持流式 Blob 接口、session
扩展等,可用于构建客户端同步系统等。 - cgo:这些方法都依赖 cgo 集成 C 和 Go,但会增加操作复杂性,构建使用 SQLite 的 Go 程序需要目标 C 编译器。
- 标准
- Go 和 SQLite 用于客户端:正在构建一个 iOS 应用,几乎所有代码用 Go 编写,UI 由 Web 视图提供,需要处理大量本地结构化数据、设备端全文搜索、后台任务和数据库同步等。使用
Session
扩展构建简单的客户端同步系统,要注意数据库设计以减少冲突,如将 FTS 表分离,限制数据库更新到单个连接以保持更改集质量,还使用SAVEPOINT
实现嵌套事务。 - Go 和 SQLite 在云端:设计一个在 AWS 上运行的单 VM 服务,使用三个 EBS 卷,定期将系统和客户 EBS 卷快照到 S3,主 EBS 卷定期刷新 WAL 缓存并备份到 S3,服务是单 Go 二进制,利用 SQLite 的共享缓存和 WAL 提高并发性能,还使用增量 Blob API 处理大字节字段。
- 设计与单进程编程:思考是否真的需要 N 台计算机,很多问题可在一台计算机上解决,确定这个边界,对于小型企业可能几年内一台计算机就足够,对于大型问题可使用 CDN 或地理分片等解决方案。
- 独立开发者技术对企业程序员的启示:即使不使用这种技术栈,也可以将“一个大 VM、一个区域、一个进程 Go、SQLite 和快照备份”的堆栈作为假设工具来测试设计,考虑在小型内部或实验项目中使用类似的独立堆栈进行原型设计和实验。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。