最終回となる第15回では、Rustにおけるデータベースシステムの利用を紹介します。ここまでのサンプルではデータソースはJSONファイルやWeb Storageでしたが、ここでデータソースにデータベースを使うようにしてアプリを強化します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載のサンプルコードをGitHubで公開しています。こちらからダウンロードしてみてください。
今回は、Webアプリのデータをデータベースに保存するように改変します。これまでは、Webアプリの仕組みに集中するために、データをテキストファイルに保存していました。実用的なWebアプリでは、パフォーマンスや安全性などを考慮すれば、データベースへの保存が必須となります。第11回などで提供してきた、actix-webのWebアプリに実装します。
Rustでは、SQL系とNoSQL系の双方について、データベース利用のためのクレートが充実しています。SQL系も、SQL文を記述して直接クエリを発行するタイプと、ORM(下記の補足を参照)によってデータベースへのアクセスを抽象化するタイプなどに分かれます。データベースに保存するデータの構造や複雑さ、プログラミングする上での導入の容易さなどを勘案して、どのクレートを利用するかを決めることになります。
ORMはオブジェクト関係マッピング(Object-Relational Mapping)の略で、オブジェクト指向プログラミングとリレーショナルデータベース間の互換性向上のための技術です。ORMには、プログラミング言語のクラスとデータベースのテーブルをマッピングすることで、クエリを直接記述しなくともデータベースを利用できるというメリットがあります。
SQL系データベースの最初の選択肢として、SQLite、MySQL、PostgreSQLなどのRDBMSに特化したクレートの利用があります。SQLiteならsqlite、MySQLならmysql、PostgreSQLならpostgresというようにそのものズバリのクレートです。利用するRDBMSが決まっていれば、これらは有力な選択肢になるでしょう。ただしRDBMSが流動的であるとか、開発と本番で環境が変わるといった場合には、次に紹介するSQLxを検討すべきです。
SQLxは、非ORMタイプのSQLデータベースクレートです。公式に、「SQLx is not an ORM!」とうたっているように、ORMをサポートしません。そのためSQL文の記述が必要ですが、コンパイル時にクエリの正当性をチェックする仕組みが備わっています。ここでテーブルと構造体のフィールドをバインドするなど、ORMではないですがそれに準ずる使い勝手の良さを持ちます。非同期処理にも対応しており、非同期ランタイムもTokioやActixに対応するなど、幅広いサポートとなっています。
Dieselは、RustのためのORMタイプのデータベースクレートです。登場は2015年とRustとほぼ時期を同じにしており、長い間にわたりRustにおけるデータベースアクセスのためのクレートとして利用されています。豊富な実績と充実した機能が特徴ですが、仕様が膨大であり手軽に導入するにはハードルが高いようです。また、非同期処理に対応していないなど、パフォーマンスを要求される場合には適さないという弱点もあります。
SeaORMも、RustのためのORMタイプのデータベースクレートです。2021年のリリースとDieselに遅れての登場ですが、SQLxを内部的に利用しているので非同期処理に対応しており、これがDieselに対するアドバンテージとなり利用者を伸ばしています。
Tokioは、Rustにおける非同期実行のためのライブラリです。ランタイムと関数を提供します。RustにはFutureという非同期実行のサポートがありますが、実行に関しては外部のランタイムに依存しています。その一つがTokioであり、async-stdやActixなども使える現時点でも、実績のあるTokioが使われることが多いようです。
NoSQL系としては、MongoDBのためのmongodb、Redisのためのredisなど、特に前者はMongoDBによる公式のドライバであるので、NoSQL系データベースをRustで使いたいという場合には有力な選択肢でしょう。
本記事では、GitHubのStar数がDieselに匹敵し、導入の敷居が比較的低くActixにも対応しているなどの理由で、SQLxによるデータベースアクセスを取り上げます。利用するRDBMSを、あらかじめインストール、必要なセットアップを済ませておいてください。なお、本記事ではデータベースにSQLiteを利用するとして解説を進めます。MySQLやPostgreSQLを利用する場合については、必要に応じて言及します。
Copyright © ITmedia, Inc. All Rights Reserved.