Crate sea_orm[−][src]
Expand description
SeaORM
Inspired by ActiveRecord, Eloquent and TypeORM, SeaORM aims to provide you an intuitive and ergonomic API to make working with databases in Rust a first-class experience.
This is an early release of SeaORM, the API is not stable yet.
Features
- Async
Relying on SQLx, SeaORM is a new library with async support from day 1.
- Dynamic
Built upon SeaQuery, SeaORM allows you to build complex queries without ‘fighting the ORM’.
- Testable
Use mock connections to write unit tests for your logic.
- Service oriented
Quickly build services that join, filter, sort and paginate data in APIs.
A quick taste of SeaORM
Select
// find all models let cakes: Vec<cake::Model> = Cake::find().all(db).await?; // find and filter let chocolate: Vec<cake::Model> = Cake::find() .filter(cake::Column::Name.contains("chocolate")) .all(db) .await?; // find one model let cheese: Option<cake::Model> = Cake::find_by_id(1).one(db).await?; let cheese: cake::Model = cheese.unwrap(); // find related models (lazy) let fruits: Vec<fruit::Model> = cheese.find_related(Fruit).all(db).await?; // find related models (eager) let cake_with_fruits: Vec<(cake::Model, Vec<fruit::Model>)> = Cake::find() .find_with_related(Fruit) .all(db) .await?;
Insert
let apple = fruit::ActiveModel { name: Set("Apple".to_owned()), ..Default::default() // no need to set primary key }; let pear = fruit::ActiveModel { name: Set("Pear".to_owned()), ..Default::default() }; // insert one let res: InsertResult = Fruit::insert(pear).exec(db).await?; println!("InsertResult: {}", res.last_insert_id); // insert many Fruit::insert_many(vec![apple, pear]).exec(db).await?;
Update
use sea_orm::sea_query::{Expr, Value}; let pear: Option<fruit::Model> = Fruit::find_by_id(1).one(db).await?; let mut pear: fruit::ActiveModel = pear.unwrap().into(); pear.name = Set("Sweet pear".to_owned()); // update one let pear: fruit::ActiveModel = Fruit::update(pear).exec(db).await?; // update many: UPDATE "fruit" SET "cake_id" = NULL WHERE "fruit"."name" LIKE '%Apple%' Fruit::update_many() .col_expr(fruit::Column::CakeId, Expr::value(Value::Null)) .filter(fruit::Column::Name.contains("Apple")) .exec(db) .await?;
Save
let banana = fruit::ActiveModel { id: Unset(None), name: Set("Banana".to_owned()), ..Default::default() }; // create, because primary key `id` is `Unset` let mut banana = banana.save(db).await?; banana.name = Set("Banana Mongo".to_owned()); // update, because primary key `id` is `Set` let banana = banana.save(db).await?;
Delete
let orange: Option<fruit::Model> = Fruit::find_by_id(1).one(db).await?; let orange: fruit::ActiveModel = orange.unwrap().into(); // delete one fruit::Entity::delete(orange).exec(db).await?; // or simply orange.delete(db).await?; // delete many: DELETE FROM "fruit" WHERE "fruit"."name" LIKE 'Orange' fruit::Entity::delete_many() .filter(fruit::Column::Name.contains("Orange")) .exec(db) .await?;
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Re-exports
Modules
Macros
Structs
Enums
Traits
Functions
Type Definitions
Derive Macros
Creates a new type that iterates of the variants of an enum.