简介

SQLx是一个rust异步数据库框架,目前最新版本为v0.3.5,文档不完善。不同于diesel这类orm框架,没有DSL,用户自己编写sql语句,将查询结果按列取出或映射到struct上。

  • 支持 async-std 和 tokio
  • 支持 postgresql 、mysql/maridb、sqlite
  • 纯rust实现mysql和postgresql 访问驱动程序(sqlite使用了 libsqlite3 C 库)
  • 支持TLS
  • 嵌套事务

添加依赖

这里的例子我们使用的异步框架为async-std,数据库为postgres

async-std

[dependencies]
async-std = { version = "1.4.0", features = ["attributes"]}
futures = "0.3"
sqlx = { version = "0.3.5", features = [ "postgres" ]}
anyhow = "1.0"

tokio

[dependencies]
sqlx = { version = "0.3.5", default-features = false, features = [ "runtime-tokio", "macros" ] }

创建表

create table todos (
	id INTEGER,
	description VARCHAR(100),
	done BOOLEAN
	
);

insert into todos values(1,'test1',true);
insert into todos values(2,'test2',false);

创建连接或连接池

连接池
use sqlx::prelude::*;
use sqlx::Pool;
use sqlx::postgres::{PgConnection,PgCursor};
use std::env;


#[async_std::main]
async fn main() -> anyhow::Result<()> {
     let mut pool = Pool::<PgConnection>::new(&env::var("DATABASE_URL")?).await?;
    // 可以对连接池配置一些参数
    // let pool = Pool::<PgConnection>::builder()
    // .max_size(5) 
    // .build(&env::var("DATABASE_URL")?).await?;
    Ok(())
}


单个连接
  let mut conn = PgConnection::connect(&env::var("DATABASE_URL")?).await?;

插入记录

    let sql="INSERT INTO todos ( id,description ,done)VALUES ( $1,$2,$3 )";
    let count=sqlx::query(sql).bind(1).bind("test3").bind(false).execute(&pool).await?;
    println!("{}",count);

更新记录

let sql=  "UPDATE todos SET done = TRUE WHERE id = $1";
    let count=sqlx::query(sql).bind(3).execute(&pool).await?;
    println!("{}",count);

查询记录

 let mut pool = Pool::<PgConnection>::new(&env::var("DATABASE_URL")?).await?;
    let sql = "select id,description,done from todos";
    let mut cursor:PgCursor = sqlx::query(sql).fetch(&pool);
    while let Some(row) = cursor.next().await? {
        let id: i32 = row.get(0);
        let description: String = row.get("description");
        let done: bool = row.get(2);
        println!("{},{},{}",id,description,done);
    }

删除记录

  let sql=  "delete from todos  WHERE id = $1";
  let count=sqlx::query(sql).bind(3).execute(&pool).await?;
  println!("{}",count);
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐