ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

sea-orm如何支持视图的查询

sea-orm如何支持视图的查询 SeaORM没有专门的“视图 Entity”类型但可以把数据库视图当成一张只读表来查询。常见做法是在数据库里创建视图然后为视图建一个只读 Entity用select_only()/column()/column_as()映射字段再用FromQueryResult接收结果。1. 先创建数据库视图例如 PostgreSQL / MySQL 里CREATE VIEW user_summary AS SELECT u.id, u.name, COUNT(o.id) AS order_count FROM users u LEFT JOIN orders o ON o.user_id u.id GROUP BY u.id, u.name;SeaORM 这边不需要知道它是视图只需要知道它像一张表一样可以SELECT。2. 为视图定义只读 Entityuse sea_orm::entity::prelude::*; #[derive(Clone, Debug, PartialEq, DeriveEntityModel)] #[sea_orm(table_name user_summary)] pub struct Model { #[sea_orm(primary_key, auto_increment false)] pub id: i32, pub name: String, // 如果数据库返回的是 BIGINT可以用 i64 pub order_count: i64, } #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] pub enum Relation {} impl ActiveModelBehavior for ActiveModel {}这里的关键是#[sea_orm(table_name user_summary)]它告诉 SeaORM这个 Entity 对应数据库里的user_summary即使它实际是视图也可以。如果你不打算通过 SeaORM 写入视图可以不使用insert()/update()/delete()只用来查询。3. 直接查询视图use user_summary::Entity as UserSummary; let rows UserSummary::find().all(db).await?;也可以按条件查询let rows UserSummary::find() .filter(user_summary::Column::OrderCount.gt(0)) .all(db) .await?;4. 如果视图字段和 Model 不完全一致用select_only()比如视图里有别名、聚合字段、表达式字段可以这样映射use sea_orm::{FromQueryResult, QuerySelect, ColumnTrait, EntityTrait}; #[derive(Debug, FromQueryResult)] struct UserSummaryRow { id: i32, name: String, order_count: i64, } let rows UserSummary::find() .select_only() .column(user_summary::Column::Id) .column(user_summary::Column::Name) .column_as(user_summary::Column::OrderCount, order_count) .into_model::UserSummaryRow() .all(db) .await?;column_as()适合处理视图中的别名字段聚合字段计算字段和 Rust 结构体字段名不完全一致的列5. 如果不想定义完整 Entity也可以直接用Statement如果只是临时查询视图不想维护 Entity可以执行原生 SQLuse sea_orm::{DbBackend, Statement, FromQueryResult}; #[derive(Debug, FromQueryResult)] struct UserSummaryRow { id: i32, name: String, order_count: i64, } let stmt Statement::from_string( DbBackend::Postgres, SELECT id, name, order_count FROM user_summary.to_owned(), ); let rows UserSummaryRow::find_by_statement(stmt) .all(db) .await?;这种方式更灵活但失去了 SeaORM Entity 的类型安全和查询构建能力。推荐做法场景推荐方式经常查询同一个视图定义只读 Entitytable_name 视图名视图字段复杂、有别名/聚合用select_only()FromQueryResult临时查询、不想建 Entity用Statement执行原生 SQL需要写入数据不建议直接写视图建议写基表所以SeaORM 支持视图查询的核心思路是把视图当作只读表映射成 Entity或者用FromQueryResult映射自定义查询结果。你的视图是从哪些表关联聚合出来的我可以帮你写一份对应的 Entity 和查询示例。
返回列表