首页/新闻资讯/正文详情

SeaORM 2.0.2 更新解读:require_one 精确查询、时间列默认值助手与 CLI 导入去重修复

发布时间:2026/9/24 13:53:41 来源:云帆数科 栏目:资讯中心
SeaORM 2.0.2 更新解读:require_one 精确查询、时间列默认值助手与 CLI 导入去重修复
后端数据库ORM【免费下载链接】sea-orm A powerful relational ORM for Rust项目地址https://gitcode.com/gh_mirrors/se/sea-orm点击查看免费下载SeaORM 2.0.2 是一次聚焦 DX开发者体验的小版本更新它为查询 API 引入了非可选版本的require_one让必须查到一行的语义直接落到错误处理上为迁移 schema 层补充了三个默认取当前时间的列定义助手同时修复了 CLI 在--preserve-user-modifications模式下重新生成实体时 import 重复输出的问题。本文以 changelog/2.0.2.md 为主线结合仓库源码逐项讲解这三个变化的用法、实现原理与适用场景帮助读者平滑升级并立即受益。一、新增require_one精确获取一行无匹配即报错1.1 与one()的对比从Option到Result在 2.0.2 之前SeaORM 的one()返回ResultOptionModel, DbErr当查询没有匹配行时得到Ok(None)。调用方需要自行unwrap或写match分支来处理可能没有结果的情况// 旧写法需要先解包 Option再决定如何处理 None let cake cake::Entity::find_by_id(1).one(db).await?; let cake cake.ok_or(DbErr::RecordNotFound(cake not found.to_owned()))?;新增的require_one是one()的非可选non-optional对应物它直接返回ResultModel, DbErr当没有行匹配时返回DbErr::RecordNotFound调用方可以直接用?传播错误无需再处理Option// 新写法语义清晰一行搞定 let cake cake::Entity::find_by_id(1).require_one(db).await?;这在按主键取详情、按唯一键取记录这类业务中非常顺手——缺失记录本身就是异常情况应当走错误分支而不是默默拿到None。1.2 实现原理基于one()的薄封装require_one的实现位于 src/executor/select.rs是one()之上的一层薄封装pub async fn require_oneC(self, db: C) - ResultS::Item, DbErr where C: ConnectionTrait, { self.one(db).await?.ok_or(record_not_found()) }其中record_not_found()在文件顶部定义src/executor/select.rs统一构造错误信息fn record_not_found() - DbErr { DbErr::RecordNotFound(None of the models match the query.to_owned()) }也就是说require_one先复用one()的完整查询路径自动加LIMIT 1、解码单行再把无结果从None转换为DbErr::RecordNotFound。错误信息统一为None of the models match the query便于上层日志与监控识别。1.3 覆盖范围五种查询形态从源码看require_one同时覆盖了Selector/SelectorRaw以及Select、SelectTwo、SelectTwoRequired三个高级查询包装器查询形态返回类型源码位置Select::require_one单模型ResultE::Model, DbErrsrc/executor/select.rsSelectTwo::require_one一主一可选关联Result(E::Model, OptionF::Model), DbErrsrc/executor/select.rsSelectTwoRequired::require_one一主一必有关联Result(E::Model, F::Model), DbErrsrc/executor/select.rsSelector::require_one通用选择器ResultS::Item, DbErrsrc/executor/select.rsSelectorRaw::require_one原生 SQL 选择器ResultS::Item, DbErrsrc/executor/select.rsSelectorRaw对应通过raw_sql!宏或Statement构建的原生 SQL 查询src/executor/select.rs因此即使是手写 SQL也能享受同样的查不到即报错语义。1.4 测试验证匹配与不匹配两种路径仓库在require_one的文档测试中演示了完整行为src/executor/select.rs// A matching row is returned directly — no Option to unwrap. let cake cake::Entity::find_by_id(1).require_one(db).await?; assert_eq!(cake.name, New York Cheese); // No matching row is a RecordNotFound error. assert!(matches!( cake::Entity::find_by_id(2).require_one(db).await, Err(DbErr::RecordNotFound(_)) ));两条断言分别覆盖了命中返回实体与未命中返回DbErr::RecordNotFound两种路径可以作为升级后自测的参考样例。二、schema 助手时间列默认值一键设为当前时间2.1 三个新助手函数2.0.2 在迁移层新增了三个列定义助手为时间类列添加服务端默认值CURRENT_TIMESTAMPdate_time_default_now对应 PR #3159为DATE_TIME类型列设置默认当前时间timestamp_default_now对应 PR #3165为TIMESTAMP类型列设置默认当前时间timestamp_with_time_zone_default_now对应 PR #3165为TIMESTAMP WITH TIME ZONE类型列设置默认当前时间。它们与既有的date_time/date_time_null/date_time_uniq、timestamp/timestamp_null/timestamp_uniq、timestamp_with_time_zone/timestamp_with_time_zone_null/timestamp_with_time_zone_uniq构成完整的时间列助手家族见 sea-orm-migration/src/schema.rs。2.2 源码实现一行default(Expr::current_timestamp())三个助手在 sea-orm-migration/src/schema.rs 中的实现高度一致——先构建对应类型的非空列再叠加current_timestamp()默认值/// A date time column with a server-side default of now. pub fn date_time_default_nowT: IntoIden(col: T) - ColumnDef { date_time(col).default(Expr::current_timestamp()).take() } /// A timestamp column with a server-side default of now. pub fn timestamp_default_nowT: IntoIden(col: T) - ColumnDef { timestamp(col).default(Expr::current_timestamp()).take() } /// A timestamp with time zone column with a server-side default of now. pub fn timestamp_with_time_zone_default_nowT: IntoIden(col: T) - ColumnDef { timestamp_with_time_zone(col) .default(Expr::current_timestamp()) .take() }注意三个助手生成的列都带not_null()约束因为内部复用了各自的非空版本且默认值是服务端的Expr::current_timestamp()——即由数据库在插入时填充当前时间而非应用层传入时间戳。这保证了即使插入语句没有显式提供该列值数据库也会自动写入当前时间适合created_at、updated_at等审计字段的建表场景。2.3 迁移中的用法示例在迁移文件中可以像使用其他 schema 助手一样使用它们use sea_orm_migration::prelude::*; #[derive(DeriveIden)] enum Post { Table, Id, CreatedAt, UpdatedAt, } #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(self, manager: SchemaManager) - Result(), DbErr { manager .create_table( Table::create() .table(Post::Table) .if_not_exists() .col(ColumnDef::new(Post::Id).integer().not_null().auto_increment().primary_key()) .col(schema::date_time_default_now(Post::CreatedAt)) .col(schema::timestamp_with_time_zone_default_now(Post::UpdatedAt)) .to_owned(), ) .await } }生成的 DDL 大致相当于created_at DATE_TIME NOT NULL DEFAULT CURRENT_TIMESTAMP、updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP。相比手动写ColumnDef::new(...).default(Expr::current_timestamp())这三个助手让意图更直白也避免了遗漏not_null或写错默认表达式的细节错误。三、Bug FixCLI 实体重新生成时的 import 去重3.1 问题背景SeaORM CLI 的实体生成器支持保留用户修改模式当目标实体文件已存在且指定了--preserve-user-modifications新版本中为--experimental-preserve-user-modifications时生成器不会直接覆盖而是把新生成的内容与用户已有文件做合并sea-orm-cli/src/commands/generate.rs。2.0.2 修复的问题在于 import 的重复输出如果用户把use foo::A; use foo::B;手工整理成了分组形式use foo::{A, B};旧的合并逻辑无法识别两者等价重新生成后会把分组 import 与展开 import 同时保留造成重复声明甚至导致编译失败。3.2 修复方式分组与单条 import 等价识别修复后的合并逻辑会将用户分组use foo::{A, B}与新生成的use foo::A; use foo::B;视为等价不再重复输出。这保证了用户整理过的分组 import 得以保留新增实体所需的新 import 正常追加同一符号不会以两种形式同时出现。涉及该逻辑的 CLI 代码位于 sea-orm-cli/src/commands/generate.rs标志定义与弃用告警在 sea-orm-cli/src/cli.rs--preserve-user-modifications已标记为弃用别名使用时会输出警告提示改用--experimental-preserve-user-modifications。3.3 使用建议如果你用类似下面的命令重新生成实体并希望保留手工修改sea-orm-cli generate entity \ --experimental-preserve-user-modifications \ -o src/entities升级到 2.0.2 后之前因 import 重复而失败或产生冗余use声明的合并结果会恢复正常。注意该功能仍带experimental前缀合并过程若遇到无法自动处理的情况CLI 会输出警告并回退到完整文件写入fallback_applied分支因此建议在版本控制下执行生成便于随时比对差异。四、升级建议与小结SeaORM 2.0.2 的三项变更都无需破坏性迁移require_one是纯新增 API可以按需替换one() 手动ok_or的写法它覆盖单模型、双模型可选/必有关联与原生 SQL 共五种形态错误统一为DbErr::RecordNotFounddate_time_default_now、timestamp_default_now、timestamp_with_time_zone_default_now三个 schema 助手可直接用于迁移建表为时间列添加服务端CURRENT_TIMESTAMP默认值CLI 的 import 去重修复让--experimental-preserve-user-modifications模式下重新生成实体更加可靠建议配合版本控制使用。完整的发布说明可查阅 changelog/2.0.2.md相关实现与测试分别位于 src/executor/select.rs 与 sea-orm-migration/src/schema.rs。升级后建议重点回归两类场景一是所有使用one()后紧跟unwrap/ok_or的查询点二是执行实体重新生成的 CI 或本地脚本。赞分享后端数据库ORM【免费下载链接】sea-orm A powerful relational ORM for Rust项目地址https://gitcode.com/gh_mirrors/se/sea-orm点击查看免费下载相关推荐EMQX 6.0.1 版本解读消息队列写入性能跃升、parse_unit 默认值变更与关键修复全览EMQX 6.0.1 版本解读消息队列写入性能跃升、parse_unit 默认值变更与关键修复全览 导读 本文基于开源 EMQX 仓库的 e6.0.1 变更记后端物联网消息队列通信Dagger v0.12.2 发布解析dagger init 行为变更、CLI 枚举默认值修复与 Cloud 遥测修正Dagger v0.12.2 发布解析 dagger init 行为变更、CLI 枚举默认值修复与 Cloud 遥测修正 Dagger v0.12.2202DevOpsCI/CD后端CLI云原生SeaORM时序数据库集成指南高效存储与查询时间序列数据SeaORM时序数据库集成指南高效存储与查询时间序列数据 时间序列数据在现代应用中无处不在从物联网传感器读数到金融交易记录再到系统监控指标。SeaORM作后端数据库ORM上一篇App Framework 常见问题解决方案下一篇2025最全Square开源生态指南从0到1构建企业级开发体系创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

PyMuPDF 完整入门教程:用 Python 驾驭 PDF 的读取、渲染、文本提取与文档维护
PyMuPDF 完整入门教程:用 Python 驾驭 PDF 的读取、渲染、文本提取与文档维护

图像处理 【免费下载链接】PyMuPDF PyMuPDF is a high performance Python library for data extraction, analysis, conversion & manipulation of PDF (and other) documents. 项目地址: https://gitcode.com/gh_mirrors/py/PyMuPDF 点击查看 免费下载 PyMuP… · 2026/9/24 13:53:35

枚举、反射
枚举、反射

一、 枚举1.1 枚举的概述枚举是 Java 中一种特殊的类,它可以定义固定数量的枚举实例,例如: 性别、交通信号灯、季节等等1.2 为什么要使用枚举假设我们要定义一个人类,人类中包含姓名和性别。通常会将性别定义成字符串类型不使用枚举存在的问题… · 2026/9/24 13:53:35

QzoneArchive完整指南:5分钟把QQ空间动态、照片、视频安全归档到本地
QzoneArchive完整指南:5分钟把QQ空间动态、照片、视频安全归档到本地

QzoneArchive完整指南:5分钟把QQ空间动态、照片、视频安全归档到本地 【免费下载链接】QzoneArchive 将 QQ 空间历史动态、照片、视频与互动记录安全归档到本地的桌面 / 移动端工具。 项目地址: https://gitcode.com/gh_mirrors/qz/QzoneArchive QzoneArchiv… · 2026/9/24 13:53:35

无限token实战指南:突破大模型上下文限制与提示词优化
无限token实战指南:突破大模型上下文限制与提示词优化

“ChatGPT 开启无限 token”,这个搜索词这段时间热度一直没降过。搜它的人通常分两种:一种是被上下文窗口卡死的,聊天记录一长,模型就“失忆”,前面说过的关键信息全被截断;另一种是被配额锁住的&#xff0… · 2026/9/24 23:50:44

STM32+华为云IoT智能鞋柜:从除湿杀菌到自动选鞋
STM32+华为云IoT智能鞋柜:从除湿杀菌到自动选鞋

回南天的时候打开鞋柜一股霉味扑面而来;下班回家满身疲惫还要弯腰翻鞋找鞋;出差一个月回来柜子里几双皮鞋全部长了绿毛——这些都是我做个基于STM32智能鞋柜的直接动因。项目毕业后复盘整理了一下,从需求拆解、硬件选型、STM32嵌入式代码到华… · 2026/9/24 23:50:44

多组学联合解析:CHAMP1如何通过染色质调控肌母细胞融合
多组学联合解析:CHAMP1如何通过染色质调控肌母细胞融合

我拿到这篇Nature Communications上的多组学文章时,第一反应是标题里叠了四个技术——bulk RNA-seq、ATAC-seq、Cut&Tag、HiCAR。你随便拎一个出来,都是一整套含建库、测序、分析的实验周期,四个叠加意味着什么?意味着背后是一… · 2026/9/24 23:50:44

RabbitMQ交换机深度拆解:四种类型路由逻辑与踩坑实战
RabbitMQ交换机深度拆解:四种类型路由逻辑与踩坑实战

1. 为什么要单独聊聊交换机RabbitMQ用的时间越长,越发现一个问题:很多人把队列当成消息存储的终点来用,却对真正负责消息分发的核心组件——交换机(Exchange)一知半解。面试时问一句“RabbitMQ有哪几种交换机类型&… · 2026/9/24 23:50:44

C语言贪吃蛇源码包:从课程设计到游戏开发的完整实践
C语言贪吃蛇源码包:从课程设计到游戏开发的完整实践

简介:一套基于C语言的经典贪吃蛇游戏源码包,覆盖从1.0到3.0的多个版本,适合C语言初学者、游戏开发入门者以及希望研究经典小游戏实现细节的开发者。项目涵盖游戏循环、输入处理、碰撞检测、蛇身增长等核心逻辑,同时涉及链表、文件… · 2026/9/24 23:50:37

夏普DX-2008UC/2508NC维修安全规范与故障精准定位指南
夏普DX-2008UC/2508NC维修安全规范与故障精准定位指南

简介:本资源是夏普DX-2008UC与DX-2508NC两款彩色复印机的官方维修手册PDF,面向专业维修工程师、售后技术人员及办公设备维保从业者,解决设备拆装、故障诊断、安全操作与核心组件(如LSU激光单元、感光鼓、转印/显影组件&#xff09… · 2026/9/24 23:50:37

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码