一、新增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日今天對於我來說有特殊的意義,可以說是自己人生又一次選擇的開始,拿著第二年在提高班學習的見證來到了公尺老師辦公室 借款合同。這次拿著它的感覺和去年的感覺有種特別的不同,如果說去年是抱著僥倖的心理或是試試看的思想,那麼今年就有種思想上的飛躍,因為它告訴我必須堅持下去,自己選的路跪著也...
新司機如何面對選擇
本來是想談些其它東西的,可是有人對樓主提意見,認為樓主只做婦女之友不撫慰一下少男之心好像說不過去,想想年還沒過完還是繼續八卦吧。在今天這個日子裡,樓主放個毒,給單身狗回點血。一對戀人要分手,在路口上彼此約定各自向相反的地方走一百步,大家也彼此冷靜一下。如果反悔了就轉身,如果走完一百步依然決定分手,那...