>_ DevTrendsja

言語

ホーム

言語

セクション

フロントエンド バックエンド モバイル DevOps AI / ML ゲーム開発 ブロックチェーン 組み込み セキュリティ
Rust

SQLxがRustのデータベース開発をどう変えるか

こんな経験をされたことはありますか?複雑なSQLクエリを書き、Rustプロジェクトをコンパイルし、実行したところ、列名をタイプミスしていたり、引数の渡し忘れたりでランタイムエラーが発生してしまった。面倒ですよね?特に安全性ことを売りにしている言語であれば尚更です。SQLxはまさにこの問題を解決します。

そもそもSQLxとは何か

SQLxはHibernateやSQLAlchemyのような典型的なORMではありません。開発者はこれを「SQLツールキット」と呼んでいます。このプロジェクトの主な特徴は、コンパイル時にSQLクエリを検証することです。SELECTでタイプミスしたり、文字列をデータベースが期待する数値の代わりに挿入しようとすると、Rustコンパイラはバイナリのビルドを許可しません。

このプロジェクトは完全に非同期で、純粋なRustで書かれています(SQLiteドライバーを除く。Cライブラリを使用しています)。PostgreSQL、MySQL、SQLiteをサポートしています。以前はMSSQLサポートがありましたが、バージョン0.7で削除され、ゼロからドライバーを書き直すという約束がありました。

コンパイル時でのクエリ検証

これはおそらくこのライブラリの最も強力な点です。DieselやSeaORMのようにメソッドチェーン(DSL)でクエリを構築するのではなく、マクロ内にプレーンなSQLを記述します。

どのように動作するのですか?ビルド時に、SQLxはデータベースに接続し(パスは環境変数DATABASE_URLで指定)、クエリを検証するよう依頼し、型情報を返します。データベースがクエリが正しいと言えば、マクロは結果を持つ匿名構造体を生成します。

ちなみに、CIサーバーがビルドごとに実際のデータベースにアクセスすることを避けたい場合、SQLxには「オフラインモードがあります」。クエリメタデータを含むキャッシュを一度準備すれば、ネットワーク接続なしでプロジェクトをビルドできます。

非同期性とパフォーマンス

SQLxは当初からasync/awaitのために設計されました。スレッドに包まれた同期APIを模倣しようとしません。ライブラリはデータをストリーミングできます:100万行をエクスポートする必要がある場合、ソケットから到着したデータを1行ずつ処理し、メモリを一度に埋め尽くすことなく処理できます。

興味深いことに、このプロジェクトは特定のランタイムに依存しません。tokioasync-std、またはactixを使用できます—Cargo.tomlで必要なフィーチャーフラグを有効にするだけです。

SQLxは当初からasync/awaitのために設計されました。スレッドに包まれた同期APIを模倣しようとしません。ライブラリはデータをストリーミングできます:100万行をエクスポートする必要がある場合、ソケットから到着したデータを1行ずつ処理し、メモリを一度に埋め尽くすことなく処理できます。

興味深いことに、このプロジェクトは特定のランタイムに依存しません。tokioasync-std、またはactixを使用できます—Cargo.tomlで必要なフィーチャーフラグを有効にするだけです。

なぜORMではないのか

SQLxには「モデル」や「関係性」のような馴染みのある概念がありません。Rustコードでテーブルを記述しません。SQLクエリでテーブルを記述します。

データベースを完全にコントロールしたい人にとって、これは大きな利点です。特定のDBMSの全機能を活用できます:JSONBのような特定のデータ型(Postgresの場合)、ウィンドウ関数、複雑なトリガーなど。SQLxはFromRowderiveマクロを通じて結果をRust構造体にマッピングする骨の折れる作業を担当します。

小さだが便利な詳細

このライブラリには、通常はサードパーティのプラグインでしか見つからない多くの素晴らしい機能が含まれています:

  • 組み込みの接続プール。sqlx::poolや同様のライブラリを追加する必要はありません。
  • 移行サポート。CLIユーティリティとmigrate!マクロがあり、移行をバイナリに直接埋め込むことができます。
  • PostgreSQL用のLISTEN/NOTIFYサポートが標準で組み込まれています。
  • セーブポイントを通じたトランザクション処理、ネストされたトランザクションを含む。

使用する価値はあるか

SQLxは、SQLを愛し、Rustの型安全性を失うことなくデータベースのCapabilitiesを最大限に活用したい場合に最適です。

ただし、コンパイル時のクエリ検証にはビルド時間が犠牲になります。何百ものsqlx::query!マクロがある場合、sqlx::checkは著しく遅くなる可能性があります。こんな場合、開発者は開発プロファイル内のマクロに対して最適化レベルを調整することを推奨しています:

自動クエリ生成を備えた古典的なORMが必要な場合は、SeaORMを確認することをお勧めしますちなみに、SeaORMはSQLxの上に構築されています。

全体として、このプロジェクトは非常に成熟しています。GitHubで17,000以上のスターを獲得しており、アクティブなコミュニティがあります。新しいRustバックエンドを開始し、手動でSQLを記述することを厭わないなら—おそらく現在これが最良の選択です。

関連プロジェクト