Rust mysql 新的選擇

2021-10-04 18:42:18 字數 3618 閱讀 3694

一、新增mysql依賴

sqlx 是同時支援tokio2.0和async-std的非同步mysql

[dependencies]

tokio =

sqlx =

ps: 為什麼不新增macro的feature,是因為這些巨集的使用,需要在編譯器連線到資料庫才行

二、設定database_url,建立連線池

dsn:mysql:

支援的連線池的引數如下:

pub max_size: u32, // 連線池的上限

pub connect_timeout: duration, // 連線超時時間

pub min_size: u32, // 連線池的下限

pub max_lifetime: option, // 所有連線的最大生命週期

pub idle_timeout: option, // 空閒連線的生命週期

建立連線池:

let pool = sqlx::mysqlpool::builder().

max_size(100).

min_size(10).

connect_timeout(std::time::duration::from_secs(10)).

max_lifetime(std::time::duration::from_secs(1800)).

idle_timeout(std::time::duration::from_secs(600)).

build(&std::env::var("database_url").unwrap()).await?;

三、查詢sql結果

1、使用fetch,獲取cursor游標,自己處理row

let sql = "select id, username from t_user where id < ?";

let mut cursor = sqlx::query(sql).bind(3).fetch(&pool);

while let some(row) = cursor.next().await? ;

println!("", user);

}

2、使用fetch,加map,自動處理row

#[derive(debug)]

struct user

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

let sql = "select id, username from t_user limit 10";

let stream = sqlx::query(sql)

.map(|row: sqlx::mysql::mysqlrow| user )

.fetch(&pool);

tokio::pin!(stream);

while let some(user) = stream.try_next().await? ", user);

}

3、使用execute,執行更新操作,返回affect_rows

let sql = r#"update t_user set username = ? where id > ?"#;

let mut affect_rows = sqlx::query(sql).bind("wy").bind(1).execute(&pool).await?;

println!("", affect_rows);

4、使用execute和fetch,執行插入操作,獲取自增id

let mut conn = pool.acquire().await?;

let sql = r#"insert into t_user (username, password) value (?, ?);"#;

let affect_rows = sqlx::query(sql).bind("wy").bind("123456").execute(&mut conn).await?;

println!("", affect_rows);

let sql = r#"select last_insert_id();"#;

// use tokio::stream::streamext;

let insert_id: u64 = sqlx::query(sql).fetch(&mut conn).next().await?.unwrap().get(0);

println!("", insert_id);

drop(conn);

四、查詢sql結果集轉化成struct

1、定義乙個查詢的struct

#[derive(debug)]

struct user

impl<'c> sqlx::fromrow<'c, mysqlrow<'c>> for user )

}}

2、使用fetch獲取結果集vec流stream資料

let sql = "select id, username from t_user where id < ?";

// use tokio::stream::streamext;

let mut stream = sqlx::query_as::<_, user>(sql).bind(3).fetch(&pool);

while let some(user) = stream.try_next().await? ", user);

}

3、使用fetch_one獲取一條結果集user

let sql = "select id, username from t_user where id < ?";

let user: user = sqlx::query_as::<_, user>(sql).bind(3).fetch_one(&pool).await?;

println!("", user);

4、使用fetch_all獲取所有的結果集vec

let sql = "select id, username from t_user where id < ?";

let users: vec= sqlx::query_as::<_, user>(sql).bind(3).fetch_all(&pool).await?;

println!("", users);

五、事務處理
let mut conn = pool.begin().await?;

let sql = r#"insert into t_user (username, password) value (?, ?)"#;

sqlx::query(sql).bind("wy").bind("123456").execute(&mut conn).await?;

conn.commit().await?;

新的選擇器

html5的新特性和瀏覽器支援的情況 新的選擇器 queryselector ie6和ie7不支援,並且只能選擇一組中的乙個元素 queryselectorall 得到的是元素的集合,即是一組元素 getelementsbyclassname ie9及以上版本的支援的,ie8及以下版本不支援 獲取c...

新選擇 新起點

2013年7月22日今天對於我來說有特殊的意義,可以說是自己人生又一次選擇的開始,拿著第二年在提高班學習的見證來到了公尺老師辦公室 借款合同。這次拿著它的感覺和去年的感覺有種特別的不同,如果說去年是抱著僥倖的心理或是試試看的思想,那麼今年就有種思想上的飛躍,因為它告訴我必須堅持下去,自己選的路跪著也...

新司機如何面對選擇

本來是想談些其它東西的,可是有人對樓主提意見,認為樓主只做婦女之友不撫慰一下少男之心好像說不過去,想想年還沒過完還是繼續八卦吧。在今天這個日子裡,樓主放個毒,給單身狗回點血。一對戀人要分手,在路口上彼此約定各自向相反的地方走一百步,大家也彼此冷靜一下。如果反悔了就轉身,如果走完一百步依然決定分手,那...