rust SeaORM使用示例
下面通过一个完整的示例演示如何使用 SeaORM 对 PostgreSQL 数据库进行增删改查CRUD操作。1. 项目设置与依赖首先创建一个新项目并添加必要的依赖。bashcargo new seaorm-example cd seaorm-example在Cargo.toml中添加以下依赖toml[dependencies] # SeaORM 核心库启用 sqlx-postgres 特性以支持 PostgreSQL 和异步运行时 sea-orm { version 1.0, features [sqlx-postgres, runtime-tokio-rustls] } # 异步运行时 tokio { version 1, features [full] } # 用于处理异步错误 anyhow 1 # 可选用于记录日志 env_logger 0.102. 定义实体 (Entity)SeaORM 鼓励“实体优先”的工作流。我们手动定义一个bakery实体它对应数据库中的bakery表。创建文件src/entities/bakery.rsrust// src/entities/bakery.rs use sea_orm::entity::prelude::*; #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] #[sea_orm(table_name bakery)] pub struct Model { #[sea_orm(primary_key)] pub id: i32, pub name: String, #[sea_orm(column_type Double)] pub profit_margin: f64, } #[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)] pub enum Column { Id, Name, ProfitMargin, } #[derive(Copy, Clone, Debug, EnumIter, DerivePrimaryKey)] pub enum PrimaryKey { Id, } impl PrimaryKeyTrait for PrimaryKey { type ValueType i32; fn auto_increment() - bool { true } } #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] pub enum Relation {} impl Relatedsuper::chef::Entity for Entity { fn to() - RelationDef { // 我们稍后会定义 chef 实体 todo!() } } impl ActiveModelBehavior for ActiveModel {}为了让bakery模块可用在src/entities/mod.rs中声明它rust// src/entities/mod.rs pub mod bakery;3. 数据库连接与初始化在src/main.rs中我们建立数据库连接并创建一个bakery表如果它不存在的话。SeaORM 可以通过Schema工具从实体定义创建表。rust// src/main.rs mod entities; use entities::bakery; use sea_orm::{ ColumnTrait, ConnectionTrait, Database, DbBackend, DbErr, EntityTrait, QueryFilter, Schema, Set, ActiveValue::NotSet }; use anyhow::Result; #[tokio::main] async fn main() - Result() { // 初始化日志可选 env_logger::init(); // 1. 建立数据库连接 let database_url postgres://postgres:passwordlocalhost:5432/postgres; let db Database::connect(database_url).await?; // 2. 创建表如果表不存在 let schema Schema::new(DbBackend::Postgres); let create_table_stmt schema.create_table_from_entity(bakery::Entity); // 执行创建表的SQL语句 match db.execute(db.get_database_backend().build(create_table_stmt)).await { Ok(_) println!(Table bakery created or already exists.), Err(e) eprintln!(Error creating table: {}, e), }; // 3. 执行CRUD操作 run_crud_operations(db).await?; Ok(()) }4. 执行 CRUD 操作定义run_crud_operations函数在其中演示增、查、改、删操作。rustasync fn run_crud_operations(db: sea_orm::DatabaseConnection) - Result(), DbErr { // --- 插入 (Insert) --- // 使用 ActiveModel 构建要插入的数据[reference:4] let happy_bakery bakery::ActiveModel { name: Set(Happy Bakery.to_owned()), profit_margin: Set(0.0), ..Default::default() // 其他字段如 id使用默认值 }; let insert_result Bakery::insert(happy_bakery).exec(db).await?; let new_bakery_id insert_result.last_insert_id; println!(插入成功ID: {}, new_bakery_id); // --- 查询 (Select) --- // 1. 查询所有[reference:5] let all_bakeries: Vecbakery::Model Bakery::find().all(db).await?; println!(所有面包店: {:?}, all_bakeries); // 2. 根据主键查询[reference:6] let bakery_by_id: Optionbakery::Model Bakery::find_by_id(new_bakery_id).one(db).await?; if let Some(bakery) bakery_by_id { println!(根据ID查询结果: {:?}, bakery); } // 3. 带条件查询[reference:7] let sad_bakery: Optionbakery::Model Bakery::find() .filter(bakery::Column::Name.eq(Sad Bakery)) .one(db) .await?; if let Some(bakery) sad_bakery { println!(根据名字 Sad Bakery 查询结果: {:?}, bakery); } // --- 更新 (Update) --- // 1. 先查询出要更新的模型然后转换为 ActiveModel[reference:8] let mut sad_bakery_active: bakery::ActiveModel Bakery::find_by_id(new_bakery_id) .one(db) .await? .unwrap() // 为了演示假设一定存在 .into(); // 将 Model 转换为 ActiveModel // 修改字段值 sad_bakery_active.name Set(Sad Bakery.to_owned()); // 执行更新 let updated_bakery: bakery::Model sad_bakery_active.update(db).await?; println!(更新后的数据: {:?}, updated_bakery); // 2. 批量更新[reference:9] use sea_orm::{QueryFilter, Condition}; let update_result Bakery::update_many() .col_expr(bakery::Column::ProfitMargin, sea_orm::Expr::value(10.0)) .filter(bakery::Column::Name.contains(Sad)) .exec(db) .await?; println!(批量更新影响行数: {}, update_result.rows_affected); // --- 删除 (Delete) --- // 根据条件删除[reference:10] let delete_result Bakery::delete_many() .filter(bakery::Column::Name.eq(Sad Bakery)) .exec(db) .await?; println!(删除影响行数: {}, delete_result.rows_affected); Ok(()) }5. 高级特性示例关联查询 (Relations)SeaORM 支持定义实体间的关系并能进行懒加载Lazy Loading和预加载Eager Loading。rust// 假设已定义 cake 和 fruit 实体且 cake 与 fruit 是一对多关系 // 懒加载先查 Cake再查其关联的 Fruit[reference:12] let cheese_cake: Optioncake::Model Cake::find_by_id(1).one(db).await?; if let Some(cake) cheese_cake { let fruits: Vecfruit::Model cake.find_related(fruit::Entity).all(db).await?; println!(Cakes fruits: {:?}, fruits); } // 预加载一次性查询 Cake 及其关联的 Fruit[reference:13] let cakes_with_fruits: Vec(cake::Model, Vecfruit::Model) Cake::find().find_with_related(fruit::Entity).all(db).await?;事务 (Transactions)SeaORM 通过DatabaseTransaction支持事务。rustuse sea_orm::{TransactionTrait}; let txn db.begin().await?; // 在事务内执行多个操作... let bakery bakery::ActiveModel { /* ... */ }.insert(txn).await?; // ... 其他操作 txn.commit().await?; // 提交事务 // 或 txn.rollback().await?; // 回滚事务嵌套 ActiveModel (Nested ActiveModel)SeaORM 2.0 引入的Nested ActiveModel允许你一次性保存一个包含关联数据的复杂对象树。例如一次性插入一个用户及其个人资料、帖子和标签。rustlet user user::ActiveModel::builder() .set_name(Bob) .set_email(bobsea-ql.org) .set_profile(profile::ActiveModel::builder().set_picture(image.jpg)) .add_post( post::ActiveModel::builder() .set_title(Nice weather) .add_tag(tag::ActiveModel::builder().set_tag(sunny)), ) .save(db) .await?;总结这个示例涵盖了 SeaORM 的核心用法实体定义使用#[derive(DeriveEntityModel)]等宏将 Rust 结构体映射到数据库表。数据库连接通过Database::connect创建连接池。增删改查 (CRUD)通过Entity和ActiveModel提供的insert、find、update、delete等方法进行操作。高级功能支持关联查询、事务和嵌套 ActiveModel。SeaORM 的官方文档非常详尽包含了从安装到高级特性的完整指南。你可以将其作为后续深入学习的参考。

相关新闻

3步搞定专业级USB启动盘:Rufus完全使用指南

3步搞定专业级USB启动盘:Rufus完全使用指南

3步搞定专业级USB启动盘:Rufus完全使用指南 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus 还在为系统安装而烦恼吗?Rufus这款完全免费的开源工具,让你轻松制作…

2026/10/6 0:54:56 阅读更多 →
从DeepMind人才流失看AI技术栈选择与开源生态发展

从DeepMind人才流失看AI技术栈选择与开源生态发展

当一家顶尖AI实验室的核心人才开始批量出走,这背后往往不是简单的“个人职业选择”,而是一个行业风向的微妙转变。DeepMind,这个曾经在AlphaGo、AlphaFold等里程碑式AI突破中光芒万丈的名字,近期却频繁与“人才流失”的新闻绑定。…

2026/10/6 2:51:50 阅读更多 →
AI生成报表实战:Claude Code+DeepSeek+积木报表全流程测评

AI生成报表实战:Claude Code+DeepSeek+积木报表全流程测评

1. 从概念到产品:AI报表落地的真实挑战 最近几个月,AI编程助手领域可以说是“神仙打架”。Claude Code的横空出世,DeepSeek V4 Flash模型的发布,加上国内开源报表工具积木报表的持续迭代,让“AI生成报表”这个听起来很…

2026/10/10 4:10:34 阅读更多 →

最新新闻

Windows平台Rust开发环境配置与优化指南

Windows平台Rust开发环境配置与优化指南

1. Rust语言与Windows环境适配背景Rust作为一门系统级编程语言,其编译器工具链对操作系统底层有着深度依赖。在Windows平台进行Rust开发需要特别注意环境配置的差异性——与Linux/macOS不同,Windows存在MSVC和GNU两种ABI(应用程序二进制接口&…

2026/10/14 2:25:24 阅读更多 →
长波红外超构透镜偏振复用FDTD仿真全流程解析

长波红外超构透镜偏振复用FDTD仿真全流程解析

1. 项目背景与核心价值长波红外超构透镜偏振复用聚焦技术是近年来光学领域的前沿研究方向。作为一名光学工程师,我在实际项目中发现传统红外光学系统存在体积大、重量沉、功能单一等问题。而基于超构表面的偏振复用透镜,能在单层平面上实现多通道光学功能…

2026/10/14 2:25:24 阅读更多 →
2026 查重率和 AIGC 率都飘红?一站式降AI率软件实测推荐

2026 查重率和 AIGC 率都飘红?一站式降AI率软件实测推荐

一、前言:2026 高校论文审核新难题随着高校学术审核体系不断升级,知网、维普等主流检测平台全面上线AIGC 智能检测功能,当代毕业生的论文写作与修改迎来双重考验。以往论文仅需攻克重复率超标问题,如今还要规避AI写作痕迹检测风险…

2026/10/14 2:25:24 阅读更多 →
摄影工作室AI提效手册:婚纱写真儿童摄影的修图、营销与交付(v1.0)

摄影工作室AI提效手册:婚纱写真儿童摄影的修图、营销与交付(v1.0)

摄影工作室AI提效手册:婚纱、写真、儿童摄影的修图营销与交付版本 v1.0  2026年10月写在前面:这本手册解决什么这本手册写给三类人:开婚纱影楼的老板与修图主管、拍个人写真和家庭照的独立摄影师、做儿童摄影工作室的店长与后期。你大概率已…

2026/10/14 2:25:24 阅读更多 →
流水线设计实战:从冒险机制到乱序执行的性能优化

流水线设计实战:从冒险机制到乱序执行的性能优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 2:25:24 阅读更多 →
【数据可视化-155】第十五届全运会乒乓球男单半决赛:樊振东VS王楚钦技术分析报告

【数据可视化-155】第十五届全运会乒乓球男单半决赛:樊振东VS王楚钦技术分析报告

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个…

2026/10/14 2:24:24 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →