INSERT INTO shard VALUES ("crystal-db")
データベースを使用することは非常に一般的なタスクです。各種類のデータベースには、必要なシャードまたはライブラリがあります。データベースと通信するための共通APIがない場合、ORMや移行などのより高度なシャードを構築することは困難です。最終的には、1つのドライバだけをサポートするか、完全にアドホックなソリューションを作成する必要があります。共通APIがないということは、あるDBから別のDBに変更するときに異なるAPIを学ぶ必要があることも意味します。既に避けられないSQLの違い(?
/$1
、TOP
/LIMIT
など)に対処する必要があります。
しばらく前に、統合されたデータベースAPIを構築するためにcrystal-lang/crystal-dbを開始しました。
これがもはや概念実証の段階ではないことを発表できることを誇りに思います。最新のニュースを共有できることを嬉しく思います。ぜひ使用して、問題を見つけてください。
crystal-db
の役割は、Socketを使用してバインディングまたは生プロトコルを実装するSQL DBドライバから抽象化することです。
現在のcrystal-db
の実装は次のとおりです。
- libsqlite3をバインドするcrystal-lang/crystal-sqlite3。
- 100%Crystal実装を使用してMySQLと通信するcrystal-lang/crystal-mysql。
- 100%Crystal実装を使用してPostgreSQLと通信するwill/crystal-pg。
100%Crystal実装が重要なのはなぜですか?通常、これは次を意味します。
- バイナリ依存関係に関する苦痛の軽減。
- プロトコルを詳しく調べることができます。
さらに重要なことは、
- メモリフットプリントの削減。
- 言語の喜びを損なうことなく、サーバーとのソケットで直接読み書きできます。
- Crystalのネイティブ非同期I / Oをすべて活用し、現在のファイバーをブロックしません。
また、統一されたクエリAPIに加えて、crystal-db
には、接続プール、プリペアドステートメント、およびネストされたトランザクションが付属しています。
ただし、この役割は、異なるSQL方言の特殊性を抽象化することではないことに注意してください。シャードはSQLクエリを文字列として記述するための共通APIを提供しますが、SQLコード自体を分析および操作しようとはしません。
次のステップ
ドキュメントを改善する必要があります。crystal docs
を使用することに加えて、新しいセクションが追加されました。crystal-bookは、近い将来に成長し続けるでしょう。
これが、複数のドライバで機能するDBツールとシャードの構築に役立ち、より多くの人々が独自のドライバを構築することを奨励することを願っています。
特別な感謝
- コードのレビューと議論をしてくれた@spalladino、@asterite、@wajに感謝します。
- ゲームに参加してくれた@willに感謝します。
- 初期の採用者である@crisward、@raydf、@drujensen、@fridgerator、@tbrand、その他多くの人に感謝します。