2024年8月13日火曜日

Rust の sqlx クレートで select クエリを発行する

やること

Rust の sqlx クレートの使い方を学んでいくよ。

前提

プロジェクト作成

cargo init
cargo add tokio --features full
cargo add sqlx --features postgres,runtime-tokio

DB 作成

sudo apt install postgresql-client
postgres://postgres:postgres@localhost/postgres
create table account (
  id serial primary key not null,
  name varchar,
  age integer
);

insert into account
  (
    name, age
  )
values
  (
    'mikoto2000', 2000
  ),
  (
    'mikoto2048', 2048
  ),
  (
    's2000', 25
  );

実装

今回やりたいことをちょこちょこ試していたらよくわからない firststep になってしまった…。

まぁ、最低限 select 文を投げるところは分かるでしょう。

src/main.rs:

use sqlx::postgres::PgPoolOptions;
use sqlx::Column;
use sqlx::Row;
use sqlx::TypeInfo;

#[tokio::main]
async fn main() -> Result<(), sqlx::Error> {
    let pool = PgPoolOptions::new()
        .max_connections(5)
        .connect("postgres://postgres:postgres@localhost/postgres")
        .await
        .unwrap();

    // 静的なタプルにマッピング
    let row: Vec<(i32, String, i32)> = sqlx::query_as("SELECT id, name, age from account")
        .fetch_all(&pool)
        .await
        .unwrap();

    println!("{:?}", row);


    // 動的に各  row, column を確認していく
    let age: i32 = 2000;
    let result = sqlx::query("SELECT id, name, age from account WHERE age >= $1")
        .bind(age)
        .fetch_all(&pool)
        .await
        .unwrap();

    for row in result {
        for column in row.columns() {
            let type_info = column.type_info();
            let type_name = type_info.name();
            match type_name {
                "INT4" => {
                    let value: i32 = row.try_get(column.ordinal()).unwrap();
                    print!("{}, ", value);
                }
                "VARCHAR" => {
                    let value: String = row.try_get(column.ordinal()).unwrap();
                    print!("{}, ", value);
                }
                _ => {
                    print!("unknown type {}", type_name);
                }
            }
        }
        println!()
    }

    Ok(())
}

動作確認

$ cargo run
   Compiling firststep v0.1.0 (/workspaces/firststep)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.31s
     Running `target/debug/firststep`
[(1, "mikoto2000", 2000), (2, "mikoto2048", 2048), (3, "s2000", 25)]
1, mikoto2000, 2000, 
2, mikoto2048, 2048, 

OK.

以上。

参考資料

0 件のコメント:

コメントを投稿