INSERT INTO shard VALUES ("crystal-db")
使用数据库是一项非常常见的任务。对于每种类型的数据库,都需要一个 shard 或库。当没有通用的 API 来与数据库进行通信时,构建更高级的 shard(例如 ORM 或迁移)会更加困难。要么最终只支持一个驱动程序,要么需要创建整个临时解决方案。缺少通用的 API 还意味着,当从一个数据库切换到另一个数据库时,您将需要学习不同的 API。您不可避免地需要处理一些 SQL 差异:?
/$1
,TOP
/LIMIT
等等。
一段时间以前,我们开始着手创建 crystal-lang/crystal-db 来构建一个统一的数据库 API。
我们很自豪地宣布,我们已经到达了它不再是概念验证的阶段。我们很高兴与您分享最新消息,并鼓励您使用和破坏它。
crystal-db
的作用是从 SQL 数据库驱动程序中抽象出来,这些驱动程序将使用 Socket 实现绑定甚至原始协议。
当前 crystal-db
实现包括
- crystal-lang/crystal-sqlite3,它绑定了 libsqlite3。
- crystal-lang/crystal-mysql,它使用 **100% Crystal** 实现与 MySQL 进行通信。
- will/crystal-pg,它使用 **100% Crystal** 实现与 PostgreSQL 进行通信。
为什么 100% Crystal 实现很重要?通常,这意味着
- 减少二进制依赖的痛苦,
- 您可以深入了解协议。
但更重要的是
- 减少内存占用,
- 在不离开语言的乐趣的情况下,直接在套接字上读写服务器,
- 利用 Crystal 中的所有本机异步 I/O,从而不会阻塞当前的 fiber。
此外,除了统一的查询 API 之外,crystal-db
还附带连接池、预处理语句和嵌套事务。
但是,请记住,作用不是抽象出不同 SQL 方言的特性:虽然 shard 提供了使用字符串编写 SQL 查询的通用 API,但它没有尝试分析和操作 SQL 代码本身。
下一步
我们需要改进 文档。除了使用 crystal docs
,还向 添加了一个新部分 到 crystal-book,该部分将在不久的将来继续增长。
我们希望这将有助于构建与多个驱动程序一起使用的 DB 工具和 shard,并鼓励更多人构建自己的驱动程序。
特别感谢
- 感谢 @spalladino、@asterite、@waj 对代码进行审查和讨论。
- 感谢 @will 加入这场游戏。
- 感谢早期采用者 @crisward、@raydf、@drujensen、@fridgerator、@tbrand 以及许多其他人。