RUST 実践編 Ubuntu版 MariaBD(MySQL)を動かす

発端

RUSTにてwebアプリケーションの作製を行っていたところ,Rustからデータベースの操作を行うことができるという文献を目にした.ということで環境構築を行ったところ,いろいろハマったので記事にしました.また,RustからSQLを操作する日本語の記事もあまり多くなかったので参考にしていただければと思います.

Rustから操作できるデータベースの種類

Rustでは様々なデータベースを扱うライブラリが用意されているみたいです.特に有名なのが「deisel」と呼ばれるライブラリで,以下三つのデータベースをサポートしています.

  • PostgreSQL
  • MySQL(MariaDB)
  • SQLlite

主観ですが,ネットや文献ではよくSQLliteを用いたアプリケーション例がよく見られると思います.小規模なアプリケーションやSQL操作のテストに用いるためにSQLliteを使うのはよくあると考えられますが,ある程度の規模感を持ったデータベースの操作にはMySQLなどを使うことが多いのではないでしょうか?(あくまで個人の感想です.)
しかし残念ながら,deiselとMySQLを使った開発例があまり文献などになく,環境を構築するのに一苦労...

動作環境

まずは動作環境「neofetch」より

OS: Ubuntu 18.04.6 LTS aarch64
Host: NVIDIA Jetson Nano Developer
Kernel: 4.9.140-tegra
Shell: bash 4.4.20
CPU: (4) @ 1.479GHz
Memory: 1231MiB / 3964MiB

以前どこかの記事でも書いた気がしますが,使い道のない(十分に扱う知識のない)Jetson nanoをテスト用のwebサーバとして動かしています.JetsonのUbuntuは標準のUbuntuと異なっているようで,普通のUbuntuで起きないような問題がよく発生します.逆をいうとJetsonで環境構築できれば,一般的なDebian系のOSでも同様に環境構築ができるはずです.

また,今回はMySQLの代わりにMariaDBを使用します.MySQLとは親戚みたいな関係でMySQLのバックがOracl社なのに対して,MariaDBはコニュニティーが主体で開発が行われているようです.若干文法が違います.
特にラズパイやJetsonみたいな小規模なコンピュータにも導入できるのがメリットです.

本題

まずは,Dieselの公式サイトの通り,手順を追っていきましょう.Cargoのプロジェクトを作製します.

cargo new --lib diesel_test
cd diesel_test

続いて依存パッケージをCargo.tomlに記述します.

[dependencies]
diesel = { version = "1.4.4", features = ["postgres"] }
dotenv = "0.15.0"

各パッケージのバージョンは,最新のものを入れるといいと思います.ここまでは基本的にエラーの発生もなく行けると思います.続いて「Diesel CLI」をインストールします.

1つ目の穴

こんなことで引っかかるのは私ぐらいなのかもしれませんが,Dieselを使用するにはパッケージをインストールするだけではダメで,Diesel CLIをインストールする必要があります.

cargo install diesel_cli

上記のコマンドでインストールすることができますが,大体ここで失敗します.エラーログの最後の方を見ると原因を確認できますが,大体データベースのクライアントライブラリがないことが原因になると思います.MariaDBの場合は以下のライブラリをインストールすると問題が解決すると思います.
他のデータベースに関しては,公式サイトを確認してください.(MariaDB)に関する情報はないです.

sudo apt install libmariadb-dev-compat

また特定のデータベースに関するパッケージのみインストールしたい場合は

cargo install diesel_cli --no-default-features --features mysql

のコマンドを実行してください.MariaDBも–featuresの後ろをmysqlにしてください.

2つ目の穴

続いて環境パスを設定する必要があります.実行するとカレントディレクトリに.envファイルが作成されます.

echo DATABASE_URL=mysql://username:password@localhost:3306/diesel_test > .env

「username」と「password」のところにmysqlに登録されたユーザーとパスワードを入力,ポート番号はあってもなくても動くと思います.「diesel_test」のところに使用するデータベース名を入れてください.

最後,以下のコマンド

diesel setup

を実行すると.......

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

というエラーが出力されます.(きちんとMariaDBの設定を行っていると発生しないです.)
このエラーがかなりクセ者で,いろいろ調べた結果,MariaDBのソケットの設定が間違っているとのことでした.ソケットとは,クライアント(今回はRust)からSQLを呼び出すときに通る入口みたいなもので,この入口の場所が間違っているとデータベース入れないと.

解決策

多くの記事で,/etc/my.cnfの中身をいろいろ書き替えろと書いてるのですが,まずは落ち着てMariaDBの入り口(ソケット)を探します.

mysql -u user -p -h 127.0.0.1 -e "select @@socket"
+-----------------------------+
| @@socket                    |
+-----------------------------+
| /var/run/mysqld/mysqld.sock |
+-----------------------------+

上のコマンドでMariaDBのソケットを確認することができます.ちなみに私の環境では「/var/run/mysqld/mysqld.sock」にありました.一方で,どういう訳かわからないですが,MariaDBのデフォルトのソケットの位置が

mysql_config --socket
/tmp/mysql.sock ←MariaDBのクライアントはデフォルトで右のパスを通そうとする

となっています.ソケットの位置がデフォルトとずれているためエラーが発生しています.

このソケットずれを解決するために今回参考にしたのは,MySQLの公式ドキュメントにあった「MySQL の UNIX ソケットファイルを保護または変更する方法」です.
が,マニュアル通りに修正したところ一度うまく設定ができたもののサーバを再起動したらまたエラーが発生...

ソケットを使用しない接続

結論,.envファイルに記述していたlocalhostを127.0.0.1に変更することでRustから無地にMariaDBにアクセスできます.

echo DATABASE_URL=mysql://username:password@127.0.0.1:3306/diesel_test > .env

localhostに設定するとソケットを通すようで,127.0.0.1と仕様が違うようです.

以上,Rustからデータベースへアクセスをする方の参考になれば幸いです.