3
0

More than 3 years have passed since last update.

Rust + sqlx + async_std でMSSQLに接続する

Last updated at Posted at 2021-06-08

きっかけ

RustからMSSQLに接続しようと思い、まずはこちらの記事通りの方法でtiberiusを使ってうまく実装することができました。

でも、どうせならMYSQLもPostgreSQLも同じクレートが使いたいと思い、調べてみると、sqlxというクレートがMSSQLにも対応ているようなので使ってみました。

公式のドキュメントにもMSSQLのサンプルがほとんどなく、それなりに苦労したので記録を残そうと思います。

環境

  • Ubuntu-20.04 on WSL2
  • rustc 1.54.0-nghtly(2021-05-28)
  • sqlx 0.5.5
  • async_std 1.9(tokioを選ばなかったことに特別な意味はありません。)

サンプルコード

Cargo.toml
[package]
name = "sqlx-mssql"
version = "0.1.0"
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
sqlx = { version = "0.5",default-features = true, features = [ "runtime-async-std-native-tls", "mssql"] }
async-std = {version = "1.9",features = [ "attributes"]}

src/main.rs
use sqlx;
use async_std;

// DBのカラム名と型にあわせて構造体を用意します。
#[derive(sqlx::FromRow)]
struct  Data{
    id: i32,
    name:String,
}

#[async_std::main]
async fn main() -> Result<(), sqlx::Error> {
    // HOST_NAME,PORT,DBNAME,USER,PASSWORDは環境にあわせてください
    let opt = sqlx::mssql::MssqlConnectOptions::new()
        .host("HOST_NAME")
        .port(PORT)
        .database("DB_NAME")
        .username("USER")
        .password("PASSWORD");

    let pool = sqlx::MssqlPool::connect_with(opt).await?;
    let query="SELECT id, name from sample_table;"

    // いくつかやり方はあるようですが。
    let rows = sqlx::query_as::<_, Data>(query) 
        .fetch_all(&pool)
        .await?;

    for row in &rows {
        println!("ID:{}-NAME:{}", row.id, row.name);
    }
    Ok(())
}

まとめ

Rust自体さわり始めたばかりで、まだまだ理解が浅い上に、表題の組み合わせでのサンプルはネット上に見つけることができず苦労しました。
MSSQLについてはtiberius、MYSQL等についてはDiesel、async-awaitについてはtokioが現時点では日本語での情報も多く、始めやすいと思いますが、あえてイバラの道を進みたい方の参考になれば幸いです。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0