INSERT INTO shard VALUES ("crystal-db")
使用資料庫是非常常見的任務。針對每一種資料庫,都需要一個 shard 或函式庫。如果沒有通用的 API 來與資料庫溝通,建立更進階的 shards,例如 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 的實作很重要? 通常這意味著:
- 較少二進位相依性的問題,
- 您可以深入研究協定。
但更重要的是:
- 減少記憶體佔用量,
- 直接在 socket 上讀寫至伺服器,而不會失去使用這種語言的樂趣,
- 利用 Crystal 中所有的原生非同步 I/O,因此不會阻塞當前的 fiber。
此外,除了統一的查詢 API 外,crystal-db
還附帶連線池、預先準備好的陳述式和巢狀交易。
但是,請記住,其作用不是抽象化不同 SQL 方言的特性:雖然 shard 為編寫 SQL 查詢字串提供了一個通用的 API,但它不會嘗試分析和操作 SQL 程式碼本身。
下一步
我們需要改善 文件。除了使用 crystal docs
外,還在 crystal-book 中新增了一個章節,未來將會持續擴充。
我們希望這將有助於建立可與多個驅動程式配合使用的資料庫工具和 shards,並鼓勵更多人建立自己的驅動程式。
特別感謝
- 感謝 @spalladino、@asterite、@waj 審閱和討論程式碼。
- 感謝 @will 加入遊戲。
- 感謝早期採用者 @crisward、@raydf、@drujensen、@fridgerator、@tbrand 和許多其他人。