pagetakaBlog

最近リフォームと鳥取県日南町の記事多め。写真、PC、ネット等の話題も

Linux Mint で MariaDB 接続トラブル解消記(Rust対応)4-2

トラブル解消記(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!+構造体の利用など先は長いです。ご奮闘のほど。