Rust - mysql 增刪改查

一、添加mysql依賴

mysql_async 是基於tokio2.0的異步mysql

[dependencies]
mysql_async = "0.22.2"
tokio = "0.2.13"
二、設置database_url,創建連接池

DSN:mysql://root:[email protected]:3306/testdb?pool_min=10&pool_max=100&conn_ttl=10

?後面的參數列表:

  • pool_min:連接池最小值,默認10
  • pool_max:連接池最大值,默認100
  • inactive_connection_ttl:默認0秒,如果空閒連接時長大於ttl,連接數也大於pool_min,就關閉
  • ttl_check_interval:默認30秒,ttl檢測週期,每隔30秒檢查一下空間連接的狀態
  • conn_ttl:默認爲wait_timeout,如果最後一次IO執行的時長大於ttl,則關閉該連接
  • tcp_keepalive:默認爲None,tcp保持連接狀態的時長,毫秒單位
  • tcp_nodelay:默認爲true,是否啓用TCP_NODELAY選項
  • stmt_cache_size:默認10條,緩存準備好的stmt語句
  • prefer_socket:是否查詢@@socket變量
  • socket:默認爲None,Unix套接字(或Windows上的命名管道)的路徑
  • compression:默認None,壓縮快慢,(fast = 1、on = true、best = 9,0~9)

創建連接池

let pool = mysql_async::Pool::new(database_url);

從連接池獲取一個connect,當離開作用域,調用drop自動返還給pool

let conn = pool.get_conn().await?;

程序退出,需要手動關閉連接池

pool.disconnect().await?;
三、執行sql的幾種函數調用

1、ping,判斷mysql服務器是否可用

let conn = conn.ping().await?;

2、query,普通的查詢,需要自己判斷sql參數是否正確

let result = conn.query("SELECT * FROM t_user").await?;

3、prep_exec,使用stmt語句查詢

let result = conn.prep_exec("SELECT * FROM user where id = :id", params! {
    "id" => 1
}).await?;

4、只查詢一條結果集

let (conn, row): (_, Option<Row>) = conn.first_exec("SELECT * FROM user where id = :id", params! {
    "id" => 1
}).await?;

5、執行sql,不關心result結果集

    let conn = match conn.drop_exec(r"CREATE TABLE `t_user` (
      `id` INT(11) NOT NULL AUTO_INCREMENT,
      `username` VARCHAR(255) COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", ()).await {
        Ok(conn) => conn,
        Err(e) => panic!("has error")
    };

6、批量執行sql

// params是param!參數的集合
let conn = conn.batch_exec(r"INSERT INTO payment (customer_id, amount, account_name) 
VALUES (:customer_id, :amount, :account_name)", params).await?;

7、事務處理

let mut trOpts = TransactionOptions::new();
trOpts.set_isolation_level(IsolationLevel::RepeatableRead);

let tr = pool.start_transaction(trOpts).await?;

let (tr, row): (_, Option<Row>) = tr.first_exec("SELECT * FROM user where id = :id", params! {
    "id" => 1
}).await?;

tr.commit().await?;

println!("{:?}", row);
四、處理查詢結果集Rows

1、使用mysql_async::from_row(),獲取column的tuple結果

    let result = conn.prep_exec("SELECT username, email FROM user where id = :id", params! {
        "id" => 1
    }).await?;

    let (_, user_info) = result.map_and_drop(|row| {
        let (username, email): (Option<String>, Option<String>) = mysql_async::from_row(row);

        (username, email)
    }).await?;

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

2、使用row本身的函數get按照index索引,或者column的名字來獲取

    let result = conn.prep_exec("SELECT username, email FROM user where id = :id", params! {
        "id" => 1
    }).await?;

    let (_, user_info) = result.map_and_drop(|row| {
        let username: Option<String> = row.get("username");
        let email: Option<String> = row.get("email");

        (username, email)
    }).await?;

    println!("{:?}", user_info);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章