0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SeaORM的基础用法

科技绿洲 来源:TinyZ 作者:TinyZ 2023-09-19 14:37 次阅读

SeaORM是一个基于Rust语言的ORM(对象关系映射)框架,它提供了一种简单的方式来操作SQL数据库。SeaORM的设计理念是将SQL查询和Rust代码结合在一起,从而提供更好的类型安全和代码可读性。

在本教程中,我们将介绍SeaORM的基本用法和进阶用法。我们将使用SQLite数据库来演示这些用法。

基础用法

在使用SeaORM之前,我们需要将其添加到我们的Rust项目中。cargo.toml添加依赖:

sea-orm = "0.11.3"

连接到数据库

在使用SeaORM之前,我们需要连接到一个数据库。我们可以使用DatabaseConnection结构体来完成这个任务。

use sea_orm::{DatabaseConnection, DatabaseConnectionInfo};

#[async_std::main]
async fn main() - > Result< (), Box< dyn std::error::Error >> {
    let db_info = DatabaseConnectionInfo::from_env()?;
    let db_conn = DatabaseConnection::connect(&db_info).await?;
    // ...
    Ok(())
}

在上面的代码中,我们使用DatabaseConnectionInfo::from_env()方法从环境变量中获取数据库连接信息,并使用DatabaseConnection::connect()方法连接到数据库。

定义表

在SeaORM中,我们可以使用sea_query::Table结构体来定义表。我们可以定义表的名称、列名和列类型。

use sea_query::{ColumnDef, ColumnType, Table};

let users = Table::new("users")
    .add_column("id", ColumnType::Int(Some(11)).Unsigned(true).NotNull(true).AutoIncrement(true))
    .add_column("name", ColumnType::String(Some(256)).NotNull(true))
    .add_column("email", ColumnType::String(Some(256)).NotNull(true).Unique(true))
    .add_column("age", ColumnType::Int(Some(3)).Unsigned(true).NotNull(true))
    .set_primary_key(vec!["id"]);

在上面的代码中,我们定义了一个名为users的表,它有四个列:idnameemailageid列是自增的主键,nameemail列是字符串类型,age列是整数类型。

插入数据

在SeaORM中,我们可以使用InsertStatement结构体来插入数据。我们可以使用values()方法来设置要插入的值。

use sea_orm::{entity::*, query::*, DatabaseConnection};

let user = User {
    name: "John Doe".to_owned(),
    email: "john.doe@example.com".to_owned(),
    age: 30,
};

let insert = Insert::single_into(User::table())
    .values(user.clone())
    .build();

let result = User::insert(insert).exec(&db_conn).await?;

在上面的代码中,我们使用Insert::single_into()方法和values()方法来设置要插入的值。我们使用User::table()方法来获取User实体的表格。最后,我们使用User::insert()方法和exec()方法来执行插入操作。

查询数据

在SeaORM中,我们可以使用SelectStatement结构体来查询数据。我们可以使用from()方法来设置要查询的表格,使用column()方法来设置要查询的列,使用where_expr()方法来设置查询条件。

use sea_orm::{entity::*, query::*, DatabaseConnection};

let query = Select::from_table(User::table())
    .column(User::all_columns)
    .where_expr(User::email.eq("john.doe@example.com"))
    .build();

let result = User::find_by_sql(query).one(&db_conn).await?;

在上面的代码中,我们使用Select::from_table()方法和column()方法来设置要查询的表格和列。我们使用where_expr()方法来设置查询条件。最后,我们使用User::find_by_sql()方法和one()方法来查询数据。

更新数据

在SeaORM中,我们可以使用UpdateStatement结构体来更新数据。我们可以使用set()方法来设置要更新的值,使用where_expr()方法来设置更新条件。

use sea_orm::{entity::*, query::*, DatabaseConnection};

let update = Update::table(User::table())
    .set(User::name, "Jane Doe")
    .where_expr(User::email.eq("john.doe@example.com"))
    .build();

let result = User::update(update).exec(&db_conn).await?;

在上面的代码中,我们使用Update::table()方法和set()方法来设置要更新的值。我们使用where_expr()方法来设置更新条件。最后,我们使用User::update()方法和exec()方法来执行更新操作。

删除数据

在SeaORM中,我们可以使用DeleteStatement结构体来删除数据。我们可以使用where_expr()方法来设置删除条件。

use sea_orm::{entity::*, query::*, DatabaseConnection};

let delete = Delete::from_table(User::table())
    .where_expr(User::email.eq("john.doe@example.com"))
    .build();

let result = User::delete(delete).exec(&db_conn).await?;

在上面的代码中,我们使用Delete::from_table()方法和where_expr()方法来设置删除条件。最后,我们使用User::delete()方法和exec()方法来执行删除操作。

进阶用法

关联表查询

在SeaORM中,我们可以使用JoinType枚举来设置关联类型。我们可以使用JoinOn结构体来设置关联条件。

use sea_orm::{entity::*, query::*, DatabaseConnection};

let query = Select::from_table(User::table())
    .inner_join(Post::table(), JoinOn::new(User::id, Post::user_id))
    .column((User::name, Post::title))
    .build();

let result = User::find_by_sql(query).all(&db_conn).await?;

在上面的代码中,我们使用Select::from_table()方法和inner_join()方法来设置关联表格。我们使用JoinOn::new()方法来设置关联条件。最后,我们使用User::find_by_sql()方法和all()方法来查询数据。

事务处理

在SeaORM中,我们可以使用Transaction结构体来处理事务。我们可以使用begin()方法来开始事务,使用commit()方法来提交事务,使用rollback()方法来回滚事务。

use sea_orm::{entity::*, query::*, DatabaseConnection, Transaction};

let tx = Transaction::new(&db_conn).await?;

let user = User {
    name: "John Doe".to_owned(),
    email: "john.doe@example.com".to_owned(),
    age: 30,
};

let insert = Insert::single_into(User::table())
    .values(user.clone())
    .build();

let result = User::insert(insert).exec(&tx).await?;

let update = Update::table(User::table())
    .set(User::name, "Jane Doe")
    .where_expr(User::email.eq("john.doe@example.com"))
    .build();

let result = User::update(update).exec(&tx).await?;

tx.commit().await?;

在上面的代码中,我们使用Transaction::new()方法来开始事务。我们使用User::insert()方法和exec()方法来插入数据,使用User::update()方法和exec()方法来更新数据。最后,我们使用tx.commit()方法来提交事务。

总结

在本教程中,我们介绍了SeaORM的基本用法和进阶用法。SeaORM提供了一种简单的方式来操作SQL数据库,它将SQL查询和Rust代码结合在一起,提供了更好的类型安全和代码可读性。通过本教程的学习,我们可以更好地理解SeaORM的使用方法,从而更好地使用它来开发Rust应用程序。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SQL
    SQL
    +关注

    关注

    1

    文章

    738

    浏览量

    43465
  • 数据库
    +关注

    关注

    7

    文章

    3591

    浏览量

    63373
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66800
  • rust语言
    +关注

    关注

    0

    文章

    58

    浏览量

    2958
  • SeaORM
    +关注

    关注

    0

    文章

    1

    浏览量

    17
收藏 人收藏

    评论

    相关推荐

    SQLx的基础用法和进阶用法

    SQLx是一个Rust语言的异步SQL数据库访问库,支持多种数据库,包括PostgreSQL、MySQL、SQLite等。本教程将以SQLite为例,介绍SQLx的基础用法和进阶用法。 基础用法
    的头像 发表于 09-19 14:29 1247次阅读

    SQLx在Rust语言中的基础用法和进阶用法

    SQLx是一个Rust语言的异步SQL执行库,它支持多种数据库,包括MySQL、PostgreSQL、SQLite等。本教程将以MySQL数据库为例,介绍SQLx在Rust语言中的基础用法和进阶用法
    的头像 发表于 09-19 14:32 3084次阅读

    Stream模块的基础用法和进阶用法

    有用。在本教程中,我们将介绍 Stream 模块的基础用法和进阶用法,并提供示例。 基础用法 在本节中,我们将介绍 Stream 模块的基础用法,并提供基础示例。 从 Vec 中创建
    的头像 发表于 09-19 15:33 711次阅读

    常用灯头规格及用法介绍

    常用灯头规格及用法介绍 简述常用灯头规格及用法介绍
    发表于 04-19 15:40 56次下载

    镍氢电池胶的用法

    镍氢电池胶的用法
    发表于 11-10 09:39 659次阅读

    状态机原理及用法

    状态机原理及用法状态机原理及用法状态机原理及用法
    发表于 03-15 15:25 0次下载

    电阻的巧妙用法

    电阻的巧妙用法
    发表于 12-16 12:59 0次下载

    MSF及Unicorn的介绍及用法

    MSF及Unicorn的介绍及用法
    发表于 09-07 15:09 3次下载
    MSF及Unicorn的介绍及<b class='flag-5'>用法</b>

    AI UX :设计助手用法

    本集讨论了具有高投资回报率的用法类型,以及如何以及为什么要优先使用帮助用法
    的头像 发表于 11-13 06:40 1657次阅读

    #define的高级用法简介

    #define的高级用法
    的头像 发表于 02-05 11:50 3402次阅读

    attribute 用法 section 部分

    attribute 用法 section 部分
    发表于 11-16 18:21 87次下载
    attribute <b class='flag-5'>用法</b> section 部分

    CMake用法详解

    CMake用法详解
    发表于 10-25 16:28 2次下载

    INCA的一些用法

    INCA的一些用法
    的头像 发表于 11-10 15:32 6770次阅读

    分享《verdi用法小结》的pdf

    分享Verdi用法小结的pdf文档
    的头像 发表于 02-18 20:21 829次阅读
    分享《verdi<b class='flag-5'>用法</b>小结》的pdf

    pcb插针的用法

    pcb插针的用法
    的头像 发表于 12-13 16:58 699次阅读