Rust: MariaDB のデータを読む (Read)


こちらのページと同様のことを行いました。
Rustで直接SQLを書いてMySQLからデータを抽出する方法

Ubuntu 20.4 で必要となるライブラリーのインストール

sudo apt install libmariadb-client-lgpl-dev-compat

フォルダー構造

$ tree -L 2
.
├── Cargo.lock
├── Cargo.toml
├── src
│   ├── main.rs
│   └── utils.rs
└── target
    └── debug
Cargo.toml
[package]
name = "read"
version = "0.1.0"
edition = "2018"

#

[dependencies]
diesel = { version = "*", features = ["mysql"] }
src/main.rs
// --------------------------------------------------------------------
/*
    read/src/main.rs

                    Jul/20/2020
*/
// --------------------------------------------------------------------

use crate::utils::establish_connection;
// use chrono::NaiveDateTime;
// use chrono::DateTime;

use diesel::deserialize::QueryableByName;
use diesel::mysql::MysqlConnection;
use diesel::prelude::*;
use diesel::sql_query;

mod utils;

type DB = diesel::mysql::Mysql;

#[derive(Debug)]
pub struct Cities {
    id: String,
    name: String,
    population: i32,
    date_mod: String,
//  date_mod: DateTime,
}

// --------------------------------------------------------------------
impl QueryableByName<DB> for Cities {
    fn build<R: diesel::row::NamedRow<diesel::mysql::Mysql>>(
        row: &R,
    ) -> diesel::deserialize::Result<Self> {
        Ok(Cities {
            id: row.get("id")?,
            name: row.get("name")?,
            population: row.get("population")?,
    date_mod: row.get("date_mod")?,
        })
    }
}

// --------------------------------------------------------------------
fn simple_sql() {
    let connection: MysqlConnection = establish_connection();
    let cities: Vec<Cities> = sql_query(
        "SELECT id, name, population, date_mod FROM cities",
    )
    .load(&connection)
    .unwrap();

//    println!("{:?}", cities);

    for uu in cities.iter(){
//      println!("{:?}",uu);
        println!("{}\t{}\t{}\t{}",uu.id,uu.name,uu.population,uu.date_mod);
        }
}

// --------------------------------------------------------------------
fn main (){
    eprintln! ("*** 開始 ***");
    simple_sql();
    eprintln! ("*** 終了 ***");
}

// --------------------------------------------------------------------
src/utils.rs
// --------------------------------------------------------------------
/*
    src/utils.rs

                    Jul/12/2020
*/
// --------------------------------------------------------------------
use diesel::mysql::MysqlConnection;
use diesel::prelude::*;

pub fn establish_connection() -> MysqlConnection {
    let database_url = "mysql://scott:tigermask@localhost:3306/city";
    MysqlConnection::establish(&database_url)
        .expect(&format!("Error connecting to {}", database_url))
}

// --------------------------------------------------------------------

コンパイル

carogo build

実行

$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
     Running `target/debug/read`
*** 開始 ***
t3321   岡山  43781   2000-3-15
t3322   倉敷  79124   2000-8-9
t3323   津山  31586   2000-6-21
t3324   玉野  52647   2000-10-12
t3325   笠岡  82631   2000-9-25
*** 終了 ***