「トラブル解消記(Rust対応)4-1」までで、準備がほぼほぼ済みました。今回は、Rustのmain.rsでMariaDBへ外部接続します。
使うデータベースとテーブルは。あらかじめ作っておいてくださいね。idとval(整数)で一つしか値がない、というのが簡便です。爺が念押しするのもアレですけど、もし「意味わからん」「できん」ということでしたら、背景知識が少し不安かもしれません。
「localhost」 接続し、目標一歩手前まで
Rustのmain.rsプログラムに書き込むのは以下の通りです。
use mysql::prelude::*;
use mysql::*;
fn main() ->std::result::Result<(), Box<dyn std::error::Error>>{
println!("Hello, world!"); //ターミナル出力確認
let url ="mysql://user名:password@localhost/db_name";
let pool = Pool::new(url)?;
let mut conn = pool.get_conn()?;
let sql = "SELECT id, val FROM test";
let row: Option<(i32, i32)> = conn.query_first(&sql)?;
match row {
Some((id, val)) => println!("id:{}, val:{}", id, val),
None => println!("データがありません"),
}
Ok(())
}
use で、mysqlドライバ使用宣言し、fn main()で接続使用
Pythonの import xxx と同じです。Rust では use mysql::*; を書かないと、mysql crate の型や関数が使えません。mysqlドライバはデフォルトではインストールされてないので、あらかじめ準備・設定が必要です。
まず、localhostで「内部接続」成功を
接続の肝部分は、 let url ="mysql://user名:password@localhost/db_name"; です。少し行の説明します。
- db_name = 接続確認用に作ったテスト用RDBを使うのが安心
- user名とpassword = db_name用データベースのuser名とパスワード(root以外で作成済みのはず)
- let sql = "SELECT id, val FROM test"; = テスト用db_name内の「test」テーブルを対象に読込みSQL文を変数に代入
- let row: Option<(i32, i32)> = conn.query_first(&sql)?; = 接続したデータベースの最初の値を取得し、row変数に代入。ただし、id、valともに整数
このRustを「RUN」させ、コンパイルが通れば、ターミナルにid、valが表示されるはずです。
Rustは、localhost(UNIXソケット、内部接続)を、127.0.0.1(TCP/IP、外部接続)に変換している可能性がとても高いそうです。いずれにしろ、50-server.cnf許可範囲内で接続しています。
この時点で接続やターミナル表示ができない場合は、主に
- MariaDB 50-server.cnf 内の bind-address設定(接続許可の範囲を指定・制限)
- ユーザ権限(user@localhost)があるか
- Rust側の mysql crate (mysqlドライバ)準備
などが不十分な可能性があります。ご確認ください。
いよいよゴール。宅内LANでTCP/IP接続
宅内LANとはいえ、今回は自PC内のRustから同MariaDBへの接続です。でも、これができれば先は明るい。
プログラムの修正は一カ所です。
let url ="mysql://user名:password@192.168.x.x:3306/db_name";
「@192.168.x.x:3306」(「@localhost/db_name」と置き換え)
- 192.168.x.x = お使いのPCのTCP/IPをご確認ください
- 3306 = MariaDBの標準ポート。これ以外に設定済みであれば、適宜合わせてください。
Rustのmysqlドライバは、
「3306通路経由でデータベースdb_nameに接続したいです。ついては、user名+passwordで資格をご確認の上、よろしくお取り計らいください」と申請する、感じかと。
結果、無事に ターミナルに値(id, val)が表示されたら、大成功です。目標の Rust→MariaDB外部接続に到達。
爺がご案内できるのはココまで。このあと、非同期+query_as!+構造体の利用など先は長いです。ご奮闘のほど。