后端数据库ORM【免费下载链接】sea-orm A powerful relational ORM for Rust项目地址https://gitcode.com/gh_mirrors/se/sea-orm点击查看免费下载SeaORM 2.0.0-rc.31发布于 2.0.0-rc.30 之后是 2.0 系列迈向稳定版过程中的一次功能与稳定性迭代一方面为查询条件、宏派生与类型系统新增能力另一方面修复了 MySQL / SQLite 上COUNT(*)的整数溢出隐患。本文以该变更日志为骨架结合仓库源码逐一拆解这些改动背后的实现细节与使用方式帮助读者在升级到 rc.31 后快速掌握新 API 并规避兼容性陷阱。新特性ne_all条件方法补全 PostgreSQL 数组取反查询rc.31 为ColumnTrait新增了ne_all方法用于对多个值做“不等于任意一个”的取反查询与既有的eq_any形成互补。ne_all的语义与生成 SQL从源码看ne_all是eq_any的“相反操作”等价于is_not_in。其实现位于 src/entity/column.rs#[cfg(feature postgres-array)] fn ne_allV, I(self, v: I) - Expr where V: IntoValue sea_query::postgres_array::NotU8, I: IntoIteratorItem V, { use sea_query::extension::postgres::PgFunc; let values: VecValue v.into_iter().map(|v| v.into()).collect(); if let Some(first) values.first() { Expr::col(self.as_column_ref()).ne(PgFunc::all(Value::Array( first.array_type(), Some(Box::new(values)), ))) } else { Expr::col(self.as_column_ref()).is_not_in(std::iter::empty::V()) } }注意两点关键行为空集合的边界语义当传入的迭代器为空时ne_all退化为is_not_in(空集)生成WHERE 1 1而非恒假条件与eq_any空集生成WHERE 1 2的行为对称保证“全部不匹配空集合”逻辑恒真。这一点在源码的 doctest 中有明确断言src/entity/column.rs。仅限 PostgreSQL该方法是 PostgreSQL 数组扩展的一部分由postgres-arrayfeature 门控。它利用PgFunc::all生成 ALL(ARRAY [...])语法例如cake::Column::Id.ne_all(vec![4, 5])会编译为WHERE cake.id ALL(ARRAY [4,5])。与eq_any的对比使用eq_any同样位于 src/entity/column.rs生成 ANY(ARRAY [...])。两者搭配可在一条查询中表达“匹配任一”与“不匹配任一”两种集合语义// 匹配任意一个 cake::Entity::find() .filter(cake::Column::Id.eq_any(vec![4, 5])); // 不匹配任意一个rc.31 新增 cake::Entity::find() .filter(cake::Column::Id.ne_all(vec![4, 5]));泛型边界放宽eq_any/ne_all兼容性提升变更日志同时提到“放宽了eq_any/ne_all的 trait bounds”并依赖最新版sea-query。结合实现可以看出方法签名中V: IntoValue sea_query::postgres_array::NotU8的组合边界NotU8用于排除歧义的u8数组类型使得更多标量类型可以直接传入集合迭代器而无需手动构造Value。升级提示使用这两个方法前请同步升级sea-query依赖否则可能出现 trait bound 不满足的编译错误。新特性model_attrs/model_ex_attrs自定义派生属性rc.31 为#[sea_orm::model]宏引入了model_attrs与model_ex_attrs两个属性允许把自定义 derive 和 attribute 透传给生成的Model与ModelEx结构体。宏展开原理该功能在 sea-orm-macros/src/derives/model_ex.rs 中实现。宏展开流程如下遍历输入结构体上的所有属性凡是#[sea_orm(...)]之外的属性如#[derive(TS)]会被同时收进model_attrs与inherited_model_ex_attrs第 31-35 行解析#[sea_orm(model_attrs(...))]与#[sea_orm(model_ex_attrs(...))]括号内的嵌套 meta通过parse_quote!(#[#m])逐个转换成真正的Attribute分别存入model_attrs与model_ex_attrs第 40-56 行展开时model_attrs前缀在Model结构体上inherited_model_ex_attrs与model_ex_attrs前缀在ModelEx结构体上第 151-166 行。其中inherited_model_ex_attrs还会经过一轮过滤自动剔除Eq嵌套关系可能包含非Eq字段无法安全转发并把DeriveEntityModel替换为DeriveModelEx/DeriveActiveModelEx第 89-115 行。典型用法定制 TypeScript 接口名变更日志给出了配合ts-rs生成 TypeScript 类型、并重命名接口的示例#[sea_orm::model] #[derive(TS, ...)] #[sea_orm(model_attrs(ts(rename Fruit)))] #[sea_orm(model_ex_attrs(ts(rename FruitEx)))] struct Model { ... }展开后Model获得#[ts(rename Fruit)]、ModelEx获得#[ts(rename FruitEx)]从而在前端类型导出中获得自定义接口名。除此之外它同样可用于注入serde、Clone、Debug等任意 derive 或 attribute为同一实体派生“展示用”与“完整关联用”两套结构体提供了更灵活的定制入口。新特性TextUuid类型列#2717rc.31 为TextUuid增加了类型化列typed column支持。TextUuid是 SeaORM 内置的 UUID 字符串包装类型定义于 src/value/text_uuid.rs内部持有uuid::Uuid以字符串形式与数据库交互并实现了ValueType、TryGetable、TryFromU64用于主键场景等 trait。类型化列位于 src/entity/column/types.rs 的TextUuidColumnE并基于 src/entity/column/types/with_uuid.rs 中的bind_oper!/bind_oper_2!/bind_vec_func!生成全套运算符bind_oper!(pub eq, eq, type TextUuid); bind_oper!(pub ne, ne, type TextUuid); bind_oper!(pub gt, gt, type TextUuid); bind_oper!(pub gte, gte, type TextUuid); bind_oper!(pub lt, lt, type TextUuid); bind_oper!(pub lte, lte, type TextUuid); bind_oper_2!(pub between, between, type TextUuid); bind_oper_2!(pub not_between, not_between, type TextUuid); bind_oper!(pub if_null, if_null, type TextUuid); bind_vec_func!(pub is_in, is_in, type TextUuid); bind_vec_func!(pub is_not_in, is_not_in, type TextUuid);这意味着以TextUuid为主键或普通列的实体现在可以用强类型方式书写过滤条件例如entity::Column::Uuid.eq(some_uuid_text)、is_in(vec![...])等无需手工做字符串/Uuid转换减少类型错误并提升可读性。Bug 修复COUNT(*)在 MySQL / SQLite 上的溢出问题#2944rc.31 修复了一个在大数据集下可能静默出错的隐患COUNT(*)在所有后端统一返回i64。背景是 MySQL 的COUNT(*)返回BIGINT64 位而此前 SeaORM 将其按i32读取当表行数超过 21 亿时会发生溢出。rc.31 起统一按i64解析。仓库中的文档示例已同步更新例如 src/executor/select.rs 中的 doctest 使用Into::Value::into(2i64)构造计数结果并将结果类型声明为Vec(String, i64)配合cake::Column::Id.count()与into_values::_, QueryAs()完成分组计数查询let res: Vec(String, i64) cake::Entity::find() .select_only() .column_as(cake::Column::Name, QueryAs::CakeName) .column_as(cake::Column::Id.count(), QueryAs::NumOfCakes) .group_by(cake::Column::Name) .into_values::_, QueryAs() .all(db) .await?;升级影响如果你此前将计数查询结果绑定到i32变量升级到 rc.31 后需要把目标类型改为i64或让类型推导自动适配否则会出现类型不匹配的编译错误。Bug 修复Proxy 错误处理#2935rc.31 修复了ProxyDatabase的错误处理路径。代理模式允许在 Rust 侧自定义数据库实现例如转发到远程服务其核心 trait 定义于 src/database/proxy.rsquery/execute返回Result_, DbErrping用于探测数据库可用性并应返回错误以标识不可用。本次修复确保了代理层在查询失败、执行失败等场景下能够正确传播DbErr而不是被吞掉或错误转换从而让上层拿到准确的错误信息。如果项目通过ProxyDatabaseTrait实现自定义数据源建议升级后补充针对异常路径的回归测试。改进移除原始字符串哈希#2381变更日志还提到一次内部重构“移除原始字符串哈希以提升可读性”。这类改动通常发生在标识符生成、内部名称编码等环节——将原先基于HashSet/ 哈希去重或哈希键控的不可读字符串替换为更直观的生成逻辑。该改动不改变对外 API但会减少--release下二进制或诊断信息中出现的不可读哈希字符串属于对开发者友好的内部整理。若你的项目依赖 SeaORM 内部行为例如宏生成结构体的Debug输出建议在升级后快速跑一遍测试确认无回归。升级建议与总结综合 rc.31 的变更升级时建议依次确认同步升级sea-queryeq_any/ne_all的 trait bound 放宽依赖最新sea-query检查计数查询的目标类型COUNT(*)结果统一为i64排查原先绑定到i32的代码按需使用新 APIPostgreSQL 用户可引入ne_all简化取反集合过滤使用ts-rs、serde等派生库的实体可通过model_attrs/model_ex_attrs定制派生属性UUID 字符串主键场景可借助TextUuidColumn获得类型化运算符回归代理与计数场景若使用了ProxyDatabase或大表计数优先验证错误传播与数值范围。整体来看rc.31 延续了 SeaORM 2.0 系列“类型安全 后端一致”的路线既在查询层补齐了集合取反能力也在宏层放开了派生定制空间同时修复了影响大数据量场景的计数溢出问题是向 2.0 稳定版推进过程中值得关注的一个版本。赞分享后端数据库ORM【免费下载链接】sea-orm A powerful relational ORM for Rust项目地址https://gitcode.com/gh_mirrors/se/sea-orm点击查看免费下载相关推荐SeaORM 2.0.0-rc.28 版本解读ActiveValue 条件更新、主键 auto_increment 修正与 Postgres 事务配置修复SeaORM 2.0.0 rc.28 版本解读ActiveValue 条件更新、主键 auto_increment 修正与 Postgres 事务配置修复 本后端数据库ORMSeaORM 2.0.0-rc.29 版本解读分布式 Tracing 支持、TextUuid 与 TryInsert 新特性全解析SeaORM 2.0.0 rc.29 版本解读分布式 Tracing 支持、TextUuid 与 TryInsert 新特性全解析 本篇文章以 SeaORM后端数据库ORMmidir Android开发实战API 29平台上的MIDI应用构建指南midir Android开发实战API 29平台上的MIDI应用构建指南 midir是一个基于Rust的跨平台实时MIDI处理库为Android API后端数据库ORM上一篇为什么OpenRadar是毫米波雷达数据处理的最佳Python方案下一篇soci-snapshotter CLI命令详解轻松掌握容器镜像懒加载创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
EmDash 插件能力深度指南:Taxonomies 分类体系与 Redirects 重定向的权限、校验与版本控制 CMS后端前端插件系统 【免费下载链接】emdash EmDash is a full-stack TypeScript CMS based on Astro; the spiritual successor to WordPress 项目地址: https://gitcode.com/gh_mirrors/emdas/emdash 点击查看 免费下载 分类体系(Taxonomies… · 2026/9/24 14:35:24
PHPStan 错误标识符 require.fileNotFound 深度解析:从触发机制到修复实践 开发工具代码质量静态分析 【免费下载链接】phpstan PHP Static Analysis Tool - discover bugs in your code without running it! 项目地址: https://gitcode.com/gh_mirrors/ph/phpstan 点击查看 免费下载 本篇技术指南围绕 PHPStan 错误标识符 require.fileNot… · 2026/9/24 14:35:05
Claude Code嵌入式开发实战:STM32项目配置与AI辅助编程技巧 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 14:34:59
EMQX HOCON 0.46.3 升级:数组型配置项敏感值脱敏与校验错误日志安全加固解析 后端物联网消息队列通信 【免费下载链接】emqx The most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles 项目地址: https://gitcode.com/gh_mirrors/em/emqx 点击查看 免费下载 导读
本文围绕 EMQX 仓库中 changelog 条目 fix-183… · 2026/9/24 15:12:27
embeddingModel操作milvus数据库集合 案例:
不是"创建集合的那一瞬间",而是"第一次使用时"
// 应用启动时(MilvusConfig执行) // 步骤1: 创建milvusClient
Bean
public MilvusServiceClient milvusClient() {return new MilvusServiceClient(...); // ✓ 只是连接数据库
}// 步骤… · 2026/9/24 15:12:02
【Dv3Admin】Vue3动态配置首页仪表盘 在做首页仪表板时,最麻烦的不是图表怎么画,而是组件来源动态、布局可拖拽、权限要隔离、还要能保存恢复。 Home 模块就是围绕这几件事做的一套标准化实现:后端下发组件定义与权限,前端负责动态渲染、拖拽布局、过滤无权限组件并紧… · 2026/9/24 15:12:02
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44