Merge branch 'master' into ss/bakery

This commit is contained in:
Sam Samai 2021-06-29 19:17:13 +10:00
commit 88bc1e1587
3 changed files with 84 additions and 13 deletions

View File

@ -66,10 +66,7 @@ async fn find_all(db: &DbConn) -> Result<(), QueryErr> {
async fn find_together(db: &DbConn) -> Result<(), QueryErr> { async fn find_together(db: &DbConn) -> Result<(), QueryErr> {
print!("find cakes and fruits: "); print!("find cakes and fruits: ");
let both = Cake::find() let both = Cake::find().find_also_related(Fruit).all(db).await?;
.find_also_related(Fruit)
.all(db)
.await?;
println!(); println!();
for bb in both.iter() { for bb in both.iter() {
@ -144,10 +141,8 @@ async fn count_fruits_by_cake(db: &DbConn) -> Result<(), QueryErr> {
async fn find_many_to_many(db: &DbConn) -> Result<(), QueryErr> { async fn find_many_to_many(db: &DbConn) -> Result<(), QueryErr> {
print!("find cakes and fillings: "); print!("find cakes and fillings: ");
let both: Vec<(cake::Model, Vec<filling::Model>)> = Cake::find() let both: Vec<(cake::Model, Vec<filling::Model>)> =
.find_with_related(Filling) Cake::find().find_with_related(Filling).all(db).await?;
.all(db)
.await?;
println!(); println!();
for bb in both.iter() { for bb in both.iter() {

View File

@ -1,6 +1,7 @@
use crate::{ExecErr, ExecResult, QueryErr, QueryResult, Statement, Transaction}; use crate::{ExecErr, ExecResult, QueryErr, QueryResult, Statement, Transaction};
use sea_query::{ use sea_query::{
MysqlQueryBuilder, PostgresQueryBuilder, QueryStatementBuilder, SqliteQueryBuilder, MysqlQueryBuilder, PostgresQueryBuilder, QueryStatementBuilder, SchemaStatementBuilder,
SqliteQueryBuilder,
}; };
use std::{error::Error, fmt}; use std::{error::Error, fmt};
@ -22,6 +23,12 @@ pub enum QueryBuilderBackend {
Sqlite, Sqlite,
} }
pub enum SchemaBuilderBackend {
MySql,
Postgres,
Sqlite,
}
#[derive(Debug)] #[derive(Debug)]
pub struct ConnectionErr; pub struct ConnectionErr;
@ -70,6 +77,18 @@ impl DatabaseConnection {
} }
} }
pub fn get_schema_builder_backend(&self) -> SchemaBuilderBackend {
match self {
#[cfg(feature = "sqlx-mysql")]
DatabaseConnection::SqlxMySqlPoolConnection(_) => SchemaBuilderBackend::MySql,
#[cfg(feature = "sqlx-sqlite")]
DatabaseConnection::SqlxSqlitePoolConnection(_) => SchemaBuilderBackend::Sqlite,
#[cfg(feature = "mock")]
DatabaseConnection::MockDatabaseConnection(_) => SchemaBuilderBackend::Postgres,
DatabaseConnection::Disconnected => panic!("Disconnected"),
}
}
pub async fn execute(&self, stmt: Statement) -> Result<ExecResult, ExecErr> { pub async fn execute(&self, stmt: Statement) -> Result<ExecResult, ExecErr> {
match self { match self {
#[cfg(feature = "sqlx-mysql")] #[cfg(feature = "sqlx-mysql")]
@ -139,3 +158,17 @@ impl QueryBuilderBackend {
.into() .into()
} }
} }
impl SchemaBuilderBackend {
pub fn build<S>(&self, statement: &S) -> Statement
where
S: SchemaStatementBuilder,
{
match self {
Self::MySql => statement.build(MysqlQueryBuilder),
Self::Postgres => statement.build(PostgresQueryBuilder),
Self::Sqlite => statement.build(SqliteQueryBuilder),
}
.into()
}
}

View File

@ -1,4 +1,47 @@
//! # Select //! <div align="center">
//!
//! <img src="docs/SeaORM banner.png"/>
//!
//! <h1>SeaORM</h1>
//!
//! <p>
//! <strong>🐚 An async & dynamic ORM for Rust</strong>
//! </p>
//!
//! <sub>Built with 🔥 by 🌊🦀🐚</sub>
//!
//! </div>
//!
//! # 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 an early WIP of SeaORM, and is not yet published. See [example](examples/sqlx-mysql/src) for demo usage.
//! ```
//!
//! ## Features
//!
//! 1. Async
//!
//! Relying on SQLx, SeaORM is a new library with async support from day 1.
//!
//! 2. Dynamic
//!
//! Built upon SeaQuery, a dynamic query builder, SeaORM allows you to build complex queries without 'fighting the ORM'.
//!
//! 3. Testable
//!
//! Use mock connections to write unit tests for your logic.
//!
//! 4. API oriented
//!
//! Quickly build search models that help you join, filter, sort and paginate data in APIs.
//!
//! # A quick taste of SeaORM
//!
//! ## Select
//! ``` //! ```
//! # use sea_orm::{DbConn, entity::*, query::*, tests_cfg::*}; //! # use sea_orm::{DbConn, entity::*, query::*, tests_cfg::*};
//! # async fn function(db: &DbConn) -> Result<(), QueryErr> { //! # async fn function(db: &DbConn) -> Result<(), QueryErr> {
@ -28,7 +71,7 @@
//! # Ok(()) //! # Ok(())
//! # } //! # }
//! ``` //! ```
//! # Insert //! ## Insert
//! ``` //! ```
//! # use sea_orm::{DbConn, entity::*, query::*, tests_cfg::*}; //! # use sea_orm::{DbConn, entity::*, query::*, tests_cfg::*};
//! # async fn function(db: &DbConn) -> Result<(), ExecErr> { //! # async fn function(db: &DbConn) -> Result<(), ExecErr> {
@ -68,7 +111,7 @@
//! # Ok(()) //! # Ok(())
//! # } //! # }
//! ``` //! ```
//! # Update //! ## Update
//! ``` //! ```
//! # use sea_orm::{DbConn, entity::*, query::*, tests_cfg::*}; //! # use sea_orm::{DbConn, entity::*, query::*, tests_cfg::*};
//! # //! #
@ -98,7 +141,7 @@
//! # Ok(()) //! # Ok(())
//! # } //! # }
//! ``` //! ```
//! # Delete //! ## Delete
//! ``` //! ```
//! # use sea_orm::{DbConn, entity::*, query::*, tests_cfg::*}; //! # use sea_orm::{DbConn, entity::*, query::*, tests_cfg::*};
//! # //! #