今天来学习rust里最热门的ORM数据库框架Diesel

Diesel是Rust语言中的一种ORM框架,用于简化与数据库的交互。下面提供了Diesel的常见操作示例:

连接数据库(Connect):

首先,你需要在Cargo.toml文件中添加Diesel和相关数据库驱动的依赖项。例如,如果要使用PostgreSQL,可以添加以下行:


[dependencies]
diesel = { version = "1.4", features = ["postgres"] }

如果是Mysql的话,那么引入以下依赖


[dependencies]
diesel = { version = "1.4", features = ["mysql"] }

然后,在Rust代码中导入Diesel的宏和相关模块:

#[macro_use]
extern crate diesel;
use diesel::prelude::*;

然后,在Rust代码中导入Diesel的宏和相关模块:
#[macro_use]
extern crate diesel;
use diesel::prelude:;
接下来,你需要配置数据库连接。Diesel需要连接到数据库才能执行查询和操作。你可以使用 diesel::mysql::MysqlConnection::establish 方法创建一个与MySQL数据库的连接。

fn main() {
    use diesel::mysql::MysqlConnection;
     let connection_url = "mysql://username:password@localhost/database_name";
    let connection = MysqlConnection::establish(&connection_url)
        .expect("Failed to establish connection to the database");
     // 在这里执行数据库操作
}

你可以使用 diesel::PgConnection::establish 方法创建一个与PostgreSQL数据库的连接。如果使用其他数据库,可以选择相应的创建连接的方法。

fn main() {
    use diesel::pg::PgConnection;
     let connection_url = "postgres://username:password@localhost/mydatabase";
    let connection = PgConnection::establish(&connection_url)
        .expect("Failed to establish connection to the database");
     // 在这里执行数据库操作
}

查询数据(Select):

假设有一个名为 users 的表,你可以使用Diesel进行查询操作。以下是一个简单的示例:

fn main() {
    use schema::users::dsl::*;
     let users = users
        .filter(name.like("%John%"))
        .limit(10)
        .load::<User>(&connection)
        .expect("Failed to load users");
     for user in users {
        println!("User: {} ({})", user.name, user.email);
    }
}

在这个示例中,我们使用了DSL(领域特定语言)来构建查询。.filter(name.like("%John%"))表示筛选出名字中包含"John"的用户, .limit(10) 表示限制结果数量为10条。 .load::(&connection) 将查询结果加载到 User 结构体的向量中。

插入数据(Insert):

要向数据库插入数据,可以使用Diesel的插入方法。以下是一个示例:

fn main() {
    use schema::users::dsl::*;
     let new_user = NewUser {
        name: "John Doe",
        email: "[email protected]",
    };
     let inserted_user = diesel::insert_into(users)
        .values(&new_user)
        .execute(&connection)
        .expect("Failed to insert user");
     println!("Inserted user: {} ({})", inserted_user.name, inserted_user.email);
}

在这个示例中,我们首先定义了一个名为 NewUser 的结构体,用于表示要插入的新用户的数据。然后,我们使用 diesel::insert_into 方法将新用户数据插入到 users 表中,并使用 .execute 方法执行插入操作。

更新数据(Update):

要更新数据库中的数据,可以使用Diesel的更新方法。以下是一个示例:

fn main() {
    use schema::users::dsl::*;
     let target_user = users.filter(id.eq(1));
     let updated_rows = diesel::update(target_user)
        .set(name.eq("New Name"))
        .execute(&connection)
        .expect("Failed to update user");
     println!("Updated rows: {}", updated_rows);
}

在这个示例中,我们首先使用 .filter(id.eq(1)) 筛选出 id 为1的用户。然后,我们使用 diesel::update 方法将该用户的 name 字段更新为"New Name"。

删除数据(Delete):

要从数据库中删除数据,可以使用Diesel的删除方法。以下是一个示例:

fn main() {
    use schema::users::dsl::*;
     let target_user = users.filter(id.eq(1));
     let deleted_rows = diesel::delete(target_user)
        .execute(&connection)
        .expect("Failed to delete user");
     println!("Deleted rows: {}", deleted_rows);
}

在这个示例中,我们首先使用 .filter(id.eq(1)) 筛选出 id 为1的用户。然后,我们使用 diesel::delete 方法删除该用户。

事务

Diesel提供了一个 transaction 函数,用于执行数据库事务。以下是在Diesel中使用事务的示例代码:

use diesel::prelude::*;
use diesel::pg::PgConnection;
 fn perform_transaction() -> Result<(), diesel::result::Error> {
    // 建立数据库连接
    let connection = PgConnection::establish("postgres://username:password@localhost/mydatabase")?;
     // 开始事务
    connection.transaction(|| {
        // 在事务中执行数据库操作
        // ...
         // 如果所有操作都成功,返回Ok(())
        Ok(())
    })
}
 fn main() {
    if let Err(err) = perform_transaction() {
        println!("Transaction failed: {}", err);
    } else {
        println!("Transaction succeeded.");
    }
}

在上述示例中,我们首先建立了与数据库的连接。然后,我们使用 transaction 函数来执行数据库事务。在 transaction 函数的闭包中,我们可以执行任意数量的数据库操作,包括插入、更新、删除等。如果所有操作都成功,闭包返回 Ok(()) ,事务将被提交。如果任何操作失败,闭包可以返回一个错误,事务将被回滚。

多数据源切换

diesel还提供了一个MultiConnection ,使用它我们可以管理多个数据源。

use diesel::prelude::*;

#[derive(diesel::MultiConnection)]
pub enum AnyConnection {
    Postgresql(diesel::PgConnection),
    Mysql(diesel::MysqlConnection),
    Sqlite(diesel::SqliteConnection),
}

diesel::table! {
    users {
        id -> Integer,
        name -> Text,
    }
}

fn use_multi(conn: &mut AnyConnection) -> QueryResult<()> {
   // Use the connection enum as any other connection type
   // for inserting/updating/loading/…
   diesel::insert_into(users::table)
       .values(users::name.eq("Sean"))
       .execute(conn)?;

   let users = users::table.load::<(i32, String)>(conn)?;

   // Match on the connection type to access
   // the inner connection. This allows us then to use
   // backend specific methods.
   if let AnyConnection::Postgresql(ref mut conn) = conn {
       // perform a postgresql specific query here
       let users = users::table.load::<(i32, String)>(conn)?;
   }

   Ok(())
}

你可能感兴趣的:(rust,学习,rust,数据库)