#きっかけ
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が現時点では日本語での情報も多く、始めやすいと思いますが、あえてイバラの道を進みたい方の参考になれば幸いです。