//!
//! //! //! //!

SeaORM

//! //!

//! 🐚 An async & dynamic ORM for Rust //!

//! //! Built with 🔥 by 🌊🦀🐚 //! //!
//! //! # 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. //! //! ```ignore //! This is a preview of SeaORM, and is not yet released. //! ``` //! //! ## Features //! //! 1. Async //! //! Relying on SQLx, SeaORM is a new library with async support from day 1. //! //! 2. Dynamic //! //! Under the hood, SeaQuery allows you to build complex, dynamic queries without 'fighting the ORM'. //! //! 3. Testable //! //! Use mock connections to write unit tests for your logic. //! //! 4. Service oriented //! //! Quickly build services that join, filter, sort and paginate data in APIs. //! //! ## A quick taste of SeaORM //! //! ### Select //! ``` //! # use sea_orm::{DbConn, error::*, entity::*, query::*, tests_cfg::*}; //! # async fn function(db: &DbConn) -> Result<(), DbErr> { //! // find all models //! let cakes: Vec = Cake::find().all(db).await?; //! //! // find and filter //! let chocolate: Vec = Cake::find() //! .filter(cake::Column::Name.contains("chocolate")) //! .all(db) //! .await?; //! //! // find one model //! let cheese: Option = Cake::find_by_id(1).one(db).await?; //! let cheese: cake::Model = cheese.unwrap(); //! //! // find related models (lazy) //! let fruits: Vec = cheese.find_related(Fruit).all(db).await?; //! //! // find related models (eager) //! let cake_with_fruits: Vec<(cake::Model, Vec)> = Cake::find() //! .find_with_related(Fruit) //! .all(db) //! .await?; //! //! # Ok(()) //! # } //! ``` //! ### Insert //! ``` //! # use sea_orm::{DbConn, error::*, entity::*, query::*, tests_cfg::*}; //! # async fn function(db: &DbConn) -> Result<(), DbErr> { //! 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); //! # Ok(()) //! # } //! # async fn function2(db: &DbConn) -> Result<(), DbErr> { //! # 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 many //! Fruit::insert_many(vec![apple, pear]).exec(db).await?; //! # Ok(()) //! # } //! ``` //! ### Update //! ``` //! # use sea_orm::{DbConn, error::*, entity::*, query::*, tests_cfg::*}; //! use sea_orm::sea_query::{Expr, Value}; //! //! # async fn function(db: &DbConn) -> Result<(), DbErr> { //! let pear: Option = 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?; //! //! # Ok(()) //! # } //! ``` //! ### Save //! ``` //! # use sea_orm::{DbConn, error::*, entity::*, query::*, tests_cfg::*}; //! # async fn function(db: &DbConn) -> Result<(), DbErr> { //! 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?; //! //! # Ok(()) //! # } //! ``` //! ### Delete //! ``` //! # use sea_orm::{DbConn, error::*, entity::*, query::*, tests_cfg::*}; //! # async fn function(db: &DbConn) -> Result<(), DbErr> { //! let orange: Option = 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 //! # let orange: fruit::ActiveModel = Fruit::find_by_id(1).one(db).await.unwrap().unwrap().into(); //! 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?; //! //! # Ok(()) //! # } //! ``` //! ## License //! //! Licensed under either of //! //! - Apache License, Version 2.0 //! ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) //! - MIT license //! ([LICENSE-MIT](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. #![doc( html_logo_url = "https://raw.githubusercontent.com/SeaQL/sea-query/master/docs/SeaQL icon dark.png" )] mod database; mod driver; pub mod entity; pub mod error; mod executor; pub mod query; #[doc(hidden)] pub mod tests_cfg; mod util; pub use database::*; pub use driver::*; pub use entity::*; pub use error::*; pub use executor::*; pub use query::*; pub use sea_orm_macros::{ DeriveActiveModel, DeriveActiveModelBehavior, DeriveColumn, DeriveEntity, DeriveModel, DerivePrimaryKey, FromQueryResult, }; pub use sea_query; pub use sea_query::Iden; pub use strum::EnumIter; pub use strum;