Seaography example WIP (#1788)
* Seaography example WIP * Seaography example * Screenshot
This commit is contained in:
parent
d7d45ae669
commit
7af76fc753
80
examples/seaography_example/README.md
Normal file
80
examples/seaography_example/README.md
Normal file
@ -0,0 +1,80 @@
|
||||
# SeaORM Seaography Example
|
||||
|
||||

|
||||
|
||||
## Specifiy a database url
|
||||
|
||||
```
|
||||
export DATABASE_URL=mysql://sea:sea@localhost/bakery
|
||||
```
|
||||
|
||||
## Setup the Database first
|
||||
|
||||
Cd into `migration` folder, follow instructions there, but basically:
|
||||
|
||||
```
|
||||
cargo run
|
||||
```
|
||||
|
||||
## Install Seaography
|
||||
|
||||
```
|
||||
cargo install seaography-cli@^1.0.0-rc.2
|
||||
```
|
||||
|
||||
## Generate Seaography project
|
||||
|
||||
```
|
||||
rm -rf graphql # this entire folder is generated
|
||||
sea-orm-cli generate entity --output-dir graphql/src/entities --seaography
|
||||
seaography-cli graphql graphql/src/entities $DATABASE_URL sea-orm-seaography-example
|
||||
```
|
||||
|
||||
## Running the project
|
||||
|
||||
```
|
||||
cd graphql
|
||||
cargo run
|
||||
```
|
||||
|
||||
## Run some queries
|
||||
|
||||
### Bakery -> Cake -> Baker
|
||||
|
||||
```graphql
|
||||
{
|
||||
bakery(pagination: { page: { limit: 10, page: 0 } }, orderBy: { name: ASC }) {
|
||||
nodes {
|
||||
name
|
||||
cake {
|
||||
nodes {
|
||||
name
|
||||
price
|
||||
baker {
|
||||
nodes {
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### List gluten-free cakes and know where to buy them
|
||||
|
||||
```graphql
|
||||
{
|
||||
cake(filters: { glutenFree: { eq: 1 } }) {
|
||||
nodes {
|
||||
name
|
||||
price
|
||||
glutenFree
|
||||
bakery {
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
BIN
examples/seaography_example/Seaography example.png
Normal file
BIN
examples/seaography_example/Seaography example.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 195 KiB |
3
examples/seaography_example/graphql/.env
Normal file
3
examples/seaography_example/graphql/.env
Normal file
@ -0,0 +1,3 @@
|
||||
DATABASE_URL="mysql://sea:sea@localhost/bakery"
|
||||
# COMPLEXITY_LIMIT=
|
||||
# DEPTH_LIMIT=
|
27
examples/seaography_example/graphql/Cargo.toml
Normal file
27
examples/seaography_example/graphql/Cargo.toml
Normal file
@ -0,0 +1,27 @@
|
||||
[package]
|
||||
edition = "2021"
|
||||
name = "sea-orm-seaography-example"
|
||||
version = "0.3.0"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
poem = { version = "1.3.56" }
|
||||
async-graphql-poem = { version = "5.0.10" }
|
||||
async-graphql = { version = "5.0.10", features = ["decimal", "chrono", "dataloader", "dynamic-schema"] }
|
||||
async-trait = { version = "0.1.72" }
|
||||
dotenv = "0.15.0"
|
||||
sea-orm = { version = "0.12.0", features = ["sqlx-mysql", "runtime-async-std-native-tls", "seaography"] }
|
||||
tokio = { version = "1.29.1", features = ["macros", "rt-multi-thread"] }
|
||||
tracing = { version = "0.1.37" }
|
||||
tracing-subscriber = { version = "0.3.17" }
|
||||
lazy_static = { version = "1.4.0" }
|
||||
|
||||
[dependencies.seaography]
|
||||
version = "1.0.0-rc.2" # seaography version
|
||||
features = ["with-decimal", "with-chrono"]
|
||||
|
||||
[dev-dependencies]
|
||||
serde_json = { version = "1.0.103" }
|
||||
|
||||
[workspace]
|
||||
members = []
|
60
examples/seaography_example/graphql/src/entities/baker.rs
Normal file
60
examples/seaography_example/graphql/src/entities/baker.rs
Normal file
@ -0,0 +1,60 @@
|
||||
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
|
||||
#[sea_orm(table_name = "baker")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key)]
|
||||
pub id: i32,
|
||||
pub name: String,
|
||||
pub contact: String,
|
||||
pub bakery_id: Option<i32>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(
|
||||
belongs_to = "super::bakery::Entity",
|
||||
from = "Column::BakeryId",
|
||||
to = "super::bakery::Column::Id",
|
||||
on_update = "Cascade",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Bakery,
|
||||
#[sea_orm(has_many = "super::cake_baker::Entity")]
|
||||
CakeBaker,
|
||||
}
|
||||
|
||||
impl Related<super::bakery::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Bakery.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::cake_baker::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::CakeBaker.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::cake::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
super::cake_baker::Relation::Cake.def()
|
||||
}
|
||||
fn via() -> Option<RelationDef> {
|
||||
Some(super::cake_baker::Relation::Baker.def().rev())
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelatedEntity)]
|
||||
pub enum RelatedEntity {
|
||||
#[sea_orm(entity = "super::bakery::Entity")]
|
||||
Bakery,
|
||||
#[sea_orm(entity = "super::cake_baker::Entity")]
|
||||
CakeBaker,
|
||||
#[sea_orm(entity = "super::cake::Entity")]
|
||||
Cake,
|
||||
}
|
43
examples/seaography_example/graphql/src/entities/bakery.rs
Normal file
43
examples/seaography_example/graphql/src/entities/bakery.rs
Normal file
@ -0,0 +1,43 @@
|
||||
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
|
||||
#[sea_orm(table_name = "bakery")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key)]
|
||||
pub id: i32,
|
||||
pub name: String,
|
||||
#[sea_orm(column_type = "Double")]
|
||||
pub profit_margin: f64,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(has_many = "super::baker::Entity")]
|
||||
Baker,
|
||||
#[sea_orm(has_many = "super::cake::Entity")]
|
||||
Cake,
|
||||
}
|
||||
|
||||
impl Related<super::baker::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Baker.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::cake::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Cake.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelatedEntity)]
|
||||
pub enum RelatedEntity {
|
||||
#[sea_orm(entity = "super::baker::Entity")]
|
||||
Baker,
|
||||
#[sea_orm(entity = "super::cake::Entity")]
|
||||
Cake,
|
||||
}
|
62
examples/seaography_example/graphql/src/entities/cake.rs
Normal file
62
examples/seaography_example/graphql/src/entities/cake.rs
Normal file
@ -0,0 +1,62 @@
|
||||
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
|
||||
#[sea_orm(table_name = "cake")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key)]
|
||||
pub id: i32,
|
||||
pub name: String,
|
||||
#[sea_orm(column_type = "Decimal(Some((19, 4)))")]
|
||||
pub price: Decimal,
|
||||
pub bakery_id: Option<i32>,
|
||||
pub gluten_free: i8,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(
|
||||
belongs_to = "super::bakery::Entity",
|
||||
from = "Column::BakeryId",
|
||||
to = "super::bakery::Column::Id",
|
||||
on_update = "Cascade",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Bakery,
|
||||
#[sea_orm(has_many = "super::cake_baker::Entity")]
|
||||
CakeBaker,
|
||||
}
|
||||
|
||||
impl Related<super::bakery::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Bakery.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::cake_baker::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::CakeBaker.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::baker::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
super::cake_baker::Relation::Baker.def()
|
||||
}
|
||||
fn via() -> Option<RelationDef> {
|
||||
Some(super::cake_baker::Relation::Cake.def().rev())
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelatedEntity)]
|
||||
pub enum RelatedEntity {
|
||||
#[sea_orm(entity = "super::bakery::Entity")]
|
||||
Bakery,
|
||||
#[sea_orm(entity = "super::cake_baker::Entity")]
|
||||
CakeBaker,
|
||||
#[sea_orm(entity = "super::baker::Entity")]
|
||||
Baker,
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
|
||||
#[sea_orm(table_name = "cake_baker")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
pub cake_id: i32,
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
pub baker_id: i32,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(
|
||||
belongs_to = "super::baker::Entity",
|
||||
from = "Column::BakerId",
|
||||
to = "super::baker::Column::Id",
|
||||
on_update = "Cascade",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Baker,
|
||||
#[sea_orm(
|
||||
belongs_to = "super::cake::Entity",
|
||||
from = "Column::CakeId",
|
||||
to = "super::cake::Column::Id",
|
||||
on_update = "Cascade",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Cake,
|
||||
}
|
||||
|
||||
impl Related<super::baker::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Baker.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::cake::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Cake.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelatedEntity)]
|
||||
pub enum RelatedEntity {
|
||||
#[sea_orm(entity = "super::baker::Entity")]
|
||||
Baker,
|
||||
#[sea_orm(entity = "super::cake::Entity")]
|
||||
Cake,
|
||||
}
|
8
examples/seaography_example/graphql/src/entities/mod.rs
Normal file
8
examples/seaography_example/graphql/src/entities/mod.rs
Normal file
@ -0,0 +1,8 @@
|
||||
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1
|
||||
|
||||
pub mod prelude;
|
||||
|
||||
pub mod baker;
|
||||
pub mod bakery;
|
||||
pub mod cake;
|
||||
pub mod cake_baker;
|
@ -0,0 +1,6 @@
|
||||
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1
|
||||
|
||||
pub use super::baker::Entity as Baker;
|
||||
pub use super::bakery::Entity as Bakery;
|
||||
pub use super::cake::Entity as Cake;
|
||||
pub use super::cake_baker::Entity as CakeBaker;
|
8
examples/seaography_example/graphql/src/lib.rs
Normal file
8
examples/seaography_example/graphql/src/lib.rs
Normal file
@ -0,0 +1,8 @@
|
||||
use sea_orm::prelude::*;
|
||||
|
||||
pub mod entities;
|
||||
pub mod query_root;
|
||||
|
||||
pub struct OrmDataloader {
|
||||
pub db: DatabaseConnection,
|
||||
}
|
64
examples/seaography_example/graphql/src/main.rs
Normal file
64
examples/seaography_example/graphql/src/main.rs
Normal file
@ -0,0 +1,64 @@
|
||||
use async_graphql::{
|
||||
dataloader::DataLoader,
|
||||
http::{playground_source, GraphQLPlaygroundConfig},
|
||||
};
|
||||
use async_graphql_poem::GraphQL;
|
||||
use dotenv::dotenv;
|
||||
use lazy_static::lazy_static;
|
||||
use poem::{get, handler, listener::TcpListener, web::Html, IntoResponse, Route, Server};
|
||||
use sea_orm::Database;
|
||||
use sea_orm_seaography_example::*;
|
||||
use std::env;
|
||||
|
||||
lazy_static! {
|
||||
static ref URL: String = env::var("URL").unwrap_or("0.0.0.0:8000".into());
|
||||
static ref ENDPOINT: String = env::var("ENDPOINT").unwrap_or("/".into());
|
||||
static ref DATABASE_URL: String =
|
||||
env::var("DATABASE_URL").expect("DATABASE_URL environment variable not set");
|
||||
static ref DEPTH_LIMIT: Option<usize> = env::var("DEPTH_LIMIT").map_or(None, |data| Some(
|
||||
data.parse().expect("DEPTH_LIMIT is not a number")
|
||||
));
|
||||
static ref COMPLEXITY_LIMIT: Option<usize> = env::var("COMPLEXITY_LIMIT")
|
||||
.map_or(None, |data| {
|
||||
Some(data.parse().expect("COMPLEXITY_LIMIT is not a number"))
|
||||
});
|
||||
}
|
||||
|
||||
#[handler]
|
||||
async fn graphql_playground() -> impl IntoResponse {
|
||||
Html(playground_source(GraphQLPlaygroundConfig::new(&ENDPOINT)))
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
dotenv().ok();
|
||||
tracing_subscriber::fmt()
|
||||
.with_max_level(tracing::Level::INFO)
|
||||
.with_test_writer()
|
||||
.init();
|
||||
let database = Database::connect(&*DATABASE_URL)
|
||||
.await
|
||||
.expect("Fail to initialize database connection");
|
||||
let orm_dataloader: DataLoader<OrmDataloader> = DataLoader::new(
|
||||
OrmDataloader {
|
||||
db: database.clone(),
|
||||
},
|
||||
tokio::spawn,
|
||||
);
|
||||
let schema = sea_orm_seaography_example::query_root::schema(
|
||||
database,
|
||||
orm_dataloader,
|
||||
*DEPTH_LIMIT,
|
||||
*COMPLEXITY_LIMIT,
|
||||
)
|
||||
.unwrap();
|
||||
let app = Route::new().at(
|
||||
&*ENDPOINT,
|
||||
get(graphql_playground).post(GraphQL::new(schema)),
|
||||
);
|
||||
println!("Visit GraphQL Playground at http://{}", *URL);
|
||||
Server::new(TcpListener::bind(&*URL))
|
||||
.run(app)
|
||||
.await
|
||||
.expect("Fail to start web server");
|
||||
}
|
28
examples/seaography_example/graphql/src/query_root.rs
Normal file
28
examples/seaography_example/graphql/src/query_root.rs
Normal file
@ -0,0 +1,28 @@
|
||||
use crate::{entities::*, OrmDataloader};
|
||||
use async_graphql::{dataloader::DataLoader, dynamic::*};
|
||||
use sea_orm::DatabaseConnection;
|
||||
use seaography::{Builder, BuilderContext};
|
||||
|
||||
lazy_static::lazy_static! { static ref CONTEXT : BuilderContext = BuilderContext :: default () ; }
|
||||
|
||||
pub fn schema(
|
||||
database: DatabaseConnection,
|
||||
orm_dataloader: DataLoader<OrmDataloader>,
|
||||
depth: Option<usize>,
|
||||
complexity: Option<usize>,
|
||||
) -> Result<Schema, SchemaError> {
|
||||
let mut builder = Builder::new(&CONTEXT);
|
||||
seaography::register_entities!(builder, [baker, bakery, cake, cake_baker,]);
|
||||
let schema = builder.schema_builder();
|
||||
let schema = if let Some(depth) = depth {
|
||||
schema.limit_depth(depth)
|
||||
} else {
|
||||
schema
|
||||
};
|
||||
let schema = if let Some(complexity) = complexity {
|
||||
schema.limit_complexity(complexity)
|
||||
} else {
|
||||
schema
|
||||
};
|
||||
schema.data(database).data(orm_dataloader).finish()
|
||||
}
|
26
examples/seaography_example/migration/Cargo.toml
Normal file
26
examples/seaography_example/migration/Cargo.toml
Normal file
@ -0,0 +1,26 @@
|
||||
[workspace]
|
||||
|
||||
[package]
|
||||
name = "migration"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
publish = false
|
||||
|
||||
[lib]
|
||||
name = "migration"
|
||||
path = "src/lib.rs"
|
||||
|
||||
[dependencies]
|
||||
async-std = { version = "1", features = ["attributes", "tokio1"] }
|
||||
|
||||
[dependencies.sea-orm]
|
||||
path = "../../.." # remove this line in your own project
|
||||
version = "0.12.1" # sea-orm version
|
||||
|
||||
[dependencies.sea-orm-migration]
|
||||
path = "../../../sea-orm-migration" # remove this line in your own project
|
||||
version = "0.12.1" # sea-orm-migration version
|
||||
features = [
|
||||
"runtime-async-std-native-tls",
|
||||
"sqlx-mysql",
|
||||
]
|
51
examples/seaography_example/migration/README.md
Normal file
51
examples/seaography_example/migration/README.md
Normal file
@ -0,0 +1,51 @@
|
||||
# Bakery Schema
|
||||
|
||||
Assume the database is named `bakery`:
|
||||
|
||||
```sh
|
||||
export DATABASE_URL=mysql://sea:sea@localhost/bakery
|
||||
```
|
||||
|
||||
# Re-generate entities
|
||||
|
||||
```sh
|
||||
sea-orm-cli generate entity --output-dir src/entity
|
||||
```
|
||||
|
||||
# Running Migrator CLI
|
||||
|
||||
- Apply all pending migrations
|
||||
```sh
|
||||
cargo run
|
||||
```
|
||||
```sh
|
||||
cargo run -- up
|
||||
```
|
||||
- Apply first 10 pending migrations
|
||||
```sh
|
||||
cargo run -- up -n 10
|
||||
```
|
||||
- Rollback last applied migrations
|
||||
```sh
|
||||
cargo run -- down
|
||||
```
|
||||
- Rollback last 10 applied migrations
|
||||
```sh
|
||||
cargo run -- down -n 10
|
||||
```
|
||||
- Drop all tables from the database, then reapply all migrations
|
||||
```sh
|
||||
cargo run -- fresh
|
||||
```
|
||||
- Rollback all applied migrations, then reapply all migrations
|
||||
```sh
|
||||
cargo run -- refresh
|
||||
```
|
||||
- Rollback all applied migrations
|
||||
```sh
|
||||
cargo run -- reset
|
||||
```
|
||||
- Check the status of all migrations
|
||||
```sh
|
||||
cargo run -- status
|
||||
```
|
50
examples/seaography_example/migration/src/entity/baker.rs
Normal file
50
examples/seaography_example/migration/src/entity/baker.rs
Normal file
@ -0,0 +1,50 @@
|
||||
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
|
||||
#[sea_orm(table_name = "baker")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key)]
|
||||
pub id: i32,
|
||||
pub name: String,
|
||||
pub contact: String,
|
||||
pub bakery_id: Option<i32>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(
|
||||
belongs_to = "super::bakery::Entity",
|
||||
from = "Column::BakeryId",
|
||||
to = "super::bakery::Column::Id",
|
||||
on_update = "Cascade",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Bakery,
|
||||
#[sea_orm(has_many = "super::cake_baker::Entity")]
|
||||
CakeBaker,
|
||||
}
|
||||
|
||||
impl Related<super::bakery::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Bakery.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::cake_baker::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::CakeBaker.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::cake::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
super::cake_baker::Relation::Cake.def()
|
||||
}
|
||||
fn via() -> Option<RelationDef> {
|
||||
Some(super::cake_baker::Relation::Baker.def().rev())
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
35
examples/seaography_example/migration/src/entity/bakery.rs
Normal file
35
examples/seaography_example/migration/src/entity/bakery.rs
Normal file
@ -0,0 +1,35 @@
|
||||
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]
|
||||
#[sea_orm(table_name = "bakery")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key)]
|
||||
pub id: i32,
|
||||
pub name: String,
|
||||
#[sea_orm(column_type = "Double")]
|
||||
pub profit_margin: f64,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(has_many = "super::baker::Entity")]
|
||||
Baker,
|
||||
#[sea_orm(has_many = "super::cake::Entity")]
|
||||
Cake,
|
||||
}
|
||||
|
||||
impl Related<super::baker::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Baker.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::cake::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Cake.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
52
examples/seaography_example/migration/src/entity/cake.rs
Normal file
52
examples/seaography_example/migration/src/entity/cake.rs
Normal file
@ -0,0 +1,52 @@
|
||||
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
|
||||
#[sea_orm(table_name = "cake")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key)]
|
||||
pub id: i32,
|
||||
pub name: String,
|
||||
#[sea_orm(column_type = "Decimal(Some((19, 4)))")]
|
||||
pub price: Decimal,
|
||||
pub bakery_id: Option<i32>,
|
||||
pub gluten_free: i8,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(
|
||||
belongs_to = "super::bakery::Entity",
|
||||
from = "Column::BakeryId",
|
||||
to = "super::bakery::Column::Id",
|
||||
on_update = "Cascade",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Bakery,
|
||||
#[sea_orm(has_many = "super::cake_baker::Entity")]
|
||||
CakeBaker,
|
||||
}
|
||||
|
||||
impl Related<super::bakery::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Bakery.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::cake_baker::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::CakeBaker.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::baker::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
super::cake_baker::Relation::Baker.def()
|
||||
}
|
||||
fn via() -> Option<RelationDef> {
|
||||
Some(super::cake_baker::Relation::Cake.def().rev())
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
@ -0,0 +1,46 @@
|
||||
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
|
||||
#[sea_orm(table_name = "cake_baker")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
pub cake_id: i32,
|
||||
#[sea_orm(primary_key, auto_increment = false)]
|
||||
pub baker_id: i32,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(
|
||||
belongs_to = "super::baker::Entity",
|
||||
from = "Column::BakerId",
|
||||
to = "super::baker::Column::Id",
|
||||
on_update = "Cascade",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Baker,
|
||||
#[sea_orm(
|
||||
belongs_to = "super::cake::Entity",
|
||||
from = "Column::CakeId",
|
||||
to = "super::cake::Column::Id",
|
||||
on_update = "Cascade",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
Cake,
|
||||
}
|
||||
|
||||
impl Related<super::baker::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Baker.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl Related<super::cake::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Cake.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
8
examples/seaography_example/migration/src/entity/mod.rs
Normal file
8
examples/seaography_example/migration/src/entity/mod.rs
Normal file
@ -0,0 +1,8 @@
|
||||
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1
|
||||
|
||||
pub mod prelude;
|
||||
|
||||
pub mod baker;
|
||||
pub mod bakery;
|
||||
pub mod cake;
|
||||
pub mod cake_baker;
|
@ -0,0 +1,6 @@
|
||||
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1
|
||||
|
||||
pub use super::baker::Entity as Baker;
|
||||
pub use super::bakery::Entity as Bakery;
|
||||
pub use super::cake::Entity as Cake;
|
||||
pub use super::cake_baker::Entity as CakeBaker;
|
29
examples/seaography_example/migration/src/lib.rs
Normal file
29
examples/seaography_example/migration/src/lib.rs
Normal file
@ -0,0 +1,29 @@
|
||||
pub use sea_orm_migration::prelude::*;
|
||||
|
||||
mod entity;
|
||||
mod m20230101_000001_create_bakery_table;
|
||||
mod m20230101_000002_create_baker_table;
|
||||
mod m20230101_000003_create_cake_table;
|
||||
mod m20230101_000004_create_cake_baker_table;
|
||||
mod m20230101_000005_create_customer_table;
|
||||
mod m20230101_000006_create_order_table;
|
||||
mod m20230101_000007_create_lineitem_table;
|
||||
mod m20230102_000001_seed_bakery_data;
|
||||
|
||||
pub struct Migrator;
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl MigratorTrait for Migrator {
|
||||
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
|
||||
vec![
|
||||
Box::new(m20230101_000001_create_bakery_table::Migration),
|
||||
Box::new(m20230101_000002_create_baker_table::Migration),
|
||||
Box::new(m20230101_000003_create_cake_table::Migration),
|
||||
Box::new(m20230101_000004_create_cake_baker_table::Migration),
|
||||
// Box::new(m20230101_000005_create_customer_table::Migration),
|
||||
// Box::new(m20230101_000006_create_order_table::Migration),
|
||||
// Box::new(m20230101_000007_create_lineitem_table::Migration),
|
||||
Box::new(m20230102_000001_seed_bakery_data::Migration),
|
||||
]
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
use sea_orm_migration::prelude::*;
|
||||
|
||||
#[derive(DeriveMigrationName)]
|
||||
pub struct Migration;
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl MigrationTrait for Migration {
|
||||
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||
manager
|
||||
.create_table(
|
||||
Table::create()
|
||||
.table(Bakery::Table)
|
||||
.col(
|
||||
ColumnDef::new(Bakery::Id)
|
||||
.integer()
|
||||
.not_null()
|
||||
.auto_increment()
|
||||
.primary_key(),
|
||||
)
|
||||
.col(ColumnDef::new(Bakery::Name).string().not_null())
|
||||
.col(ColumnDef::new(Bakery::ProfitMargin).double().not_null())
|
||||
.to_owned(),
|
||||
)
|
||||
.await
|
||||
}
|
||||
|
||||
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||
manager
|
||||
.drop_table(Table::drop().table(Bakery::Table).to_owned())
|
||||
.await
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(DeriveIden)]
|
||||
enum Bakery {
|
||||
Table,
|
||||
Id,
|
||||
Name,
|
||||
ProfitMargin,
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
use sea_orm_migration::prelude::*;
|
||||
|
||||
#[derive(DeriveMigrationName)]
|
||||
pub struct Migration;
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl MigrationTrait for Migration {
|
||||
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||
manager
|
||||
.create_table(
|
||||
Table::create()
|
||||
.table(Baker::Table)
|
||||
.col(
|
||||
ColumnDef::new(Baker::Id)
|
||||
.integer()
|
||||
.not_null()
|
||||
.auto_increment()
|
||||
.primary_key(),
|
||||
)
|
||||
.col(ColumnDef::new(Baker::Name).string().not_null())
|
||||
.col(ColumnDef::new(Baker::Contact).string().not_null())
|
||||
.col(ColumnDef::new(Baker::BakeryId).integer())
|
||||
.foreign_key(
|
||||
ForeignKey::create()
|
||||
.name("fk-baker-bakery_id")
|
||||
.from(Baker::Table, Baker::BakeryId)
|
||||
.to(Bakery::Table, Bakery::Id)
|
||||
.on_delete(ForeignKeyAction::Cascade)
|
||||
.on_update(ForeignKeyAction::Cascade),
|
||||
)
|
||||
.to_owned(),
|
||||
)
|
||||
.await
|
||||
}
|
||||
|
||||
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||
manager
|
||||
.drop_table(Table::drop().table(Baker::Table).to_owned())
|
||||
.await
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(DeriveIden)]
|
||||
enum Baker {
|
||||
Table,
|
||||
Id,
|
||||
Name,
|
||||
Contact,
|
||||
BakeryId,
|
||||
}
|
||||
|
||||
#[derive(DeriveIden)]
|
||||
enum Bakery {
|
||||
Table,
|
||||
Id,
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
use sea_orm_migration::prelude::*;
|
||||
|
||||
#[derive(DeriveMigrationName)]
|
||||
pub struct Migration;
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl MigrationTrait for Migration {
|
||||
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||
manager
|
||||
.create_table(
|
||||
Table::create()
|
||||
.table(Cake::Table)
|
||||
.col(
|
||||
ColumnDef::new(Cake::Id)
|
||||
.integer()
|
||||
.not_null()
|
||||
.auto_increment()
|
||||
.primary_key(),
|
||||
)
|
||||
.col(ColumnDef::new(Cake::Name).string().not_null())
|
||||
.col(ColumnDef::new(Cake::Price).decimal_len(19, 4).not_null())
|
||||
.col(ColumnDef::new(Cake::BakeryId).integer())
|
||||
.foreign_key(
|
||||
ForeignKey::create()
|
||||
.name("fk-cake-bakery_id")
|
||||
.from(Cake::Table, Cake::BakeryId)
|
||||
.to(Bakery::Table, Bakery::Id)
|
||||
.on_delete(ForeignKeyAction::Cascade)
|
||||
.on_update(ForeignKeyAction::Cascade),
|
||||
)
|
||||
.col(ColumnDef::new(Cake::GlutenFree).boolean().not_null())
|
||||
.to_owned(),
|
||||
)
|
||||
.await
|
||||
}
|
||||
|
||||
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||
manager
|
||||
.drop_table(Table::drop().table(Cake::Table).to_owned())
|
||||
.await
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(DeriveIden)]
|
||||
enum Cake {
|
||||
Table,
|
||||
Id,
|
||||
Name,
|
||||
Price,
|
||||
GlutenFree,
|
||||
BakeryId,
|
||||
}
|
||||
|
||||
#[derive(DeriveIden)]
|
||||
enum Bakery {
|
||||
Table,
|
||||
Id,
|
||||
}
|
@ -0,0 +1,66 @@
|
||||
use sea_orm_migration::prelude::*;
|
||||
|
||||
#[derive(DeriveMigrationName)]
|
||||
pub struct Migration;
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl MigrationTrait for Migration {
|
||||
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||
manager
|
||||
.create_table(
|
||||
Table::create()
|
||||
.table(CakeBaker::Table)
|
||||
.col(ColumnDef::new(CakeBaker::CakeId).integer().not_null())
|
||||
.col(ColumnDef::new(CakeBaker::BakerId).integer().not_null())
|
||||
.primary_key(
|
||||
Index::create()
|
||||
.name("pk-cake_baker")
|
||||
.col(CakeBaker::CakeId)
|
||||
.col(CakeBaker::BakerId),
|
||||
)
|
||||
.foreign_key(
|
||||
ForeignKey::create()
|
||||
.name("fk-cake_baker-cake_id")
|
||||
.from(CakeBaker::Table, CakeBaker::CakeId)
|
||||
.to(Cake::Table, Cake::Id)
|
||||
.on_delete(ForeignKeyAction::Cascade)
|
||||
.on_update(ForeignKeyAction::Cascade),
|
||||
)
|
||||
.foreign_key(
|
||||
ForeignKey::create()
|
||||
.name("fk-cake_baker-baker_id")
|
||||
.from(CakeBaker::Table, CakeBaker::BakerId)
|
||||
.to(Baker::Table, Baker::Id)
|
||||
.on_delete(ForeignKeyAction::Cascade)
|
||||
.on_update(ForeignKeyAction::Cascade),
|
||||
)
|
||||
.to_owned(),
|
||||
)
|
||||
.await
|
||||
}
|
||||
|
||||
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||
manager
|
||||
.drop_table(Table::drop().table(CakeBaker::Table).to_owned())
|
||||
.await
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(DeriveIden)]
|
||||
enum CakeBaker {
|
||||
Table,
|
||||
CakeId,
|
||||
BakerId,
|
||||
}
|
||||
|
||||
#[derive(DeriveIden)]
|
||||
enum Baker {
|
||||
Table,
|
||||
Id,
|
||||
}
|
||||
|
||||
#[derive(DeriveIden)]
|
||||
enum Cake {
|
||||
Table,
|
||||
Id,
|
||||
}
|
@ -0,0 +1 @@
|
||||
|
@ -0,0 +1 @@
|
||||
|
@ -0,0 +1 @@
|
||||
|
@ -0,0 +1,195 @@
|
||||
use crate::entity::{prelude::*, *};
|
||||
use sea_orm::entity::*;
|
||||
use sea_orm_migration::prelude::*;
|
||||
|
||||
#[derive(DeriveMigrationName)]
|
||||
pub struct Migration;
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl MigrationTrait for Migration {
|
||||
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||
let db = manager.get_connection();
|
||||
|
||||
let bakery = bakery::ActiveModel {
|
||||
name: Set("SeaSide Bakery".to_owned()),
|
||||
profit_margin: Set(10.4),
|
||||
..Default::default()
|
||||
};
|
||||
let sea = Bakery::insert(bakery).exec(db).await?.last_insert_id;
|
||||
|
||||
let bakery = bakery::ActiveModel {
|
||||
name: Set("LakeSide Bakery".to_owned()),
|
||||
profit_margin: Set(5.8),
|
||||
..Default::default()
|
||||
};
|
||||
let lake = Bakery::insert(bakery).exec(db).await?.last_insert_id;
|
||||
|
||||
let alice = baker::ActiveModel {
|
||||
name: Set("Alice".to_owned()),
|
||||
contact: Set("+44 15273388".to_owned()),
|
||||
bakery_id: Set(Some(sea)),
|
||||
..Default::default()
|
||||
};
|
||||
let alice = Baker::insert(alice).exec(db).await?.last_insert_id;
|
||||
|
||||
let bob = baker::ActiveModel {
|
||||
name: Set("Bob".to_owned()),
|
||||
contact: Set("+852 12345678".to_owned()),
|
||||
bakery_id: Set(Some(lake)),
|
||||
..Default::default()
|
||||
};
|
||||
let bob = Baker::insert(bob).exec(db).await?.last_insert_id;
|
||||
|
||||
let cake = cake::ActiveModel {
|
||||
name: Set("Chocolate Cake".to_owned()),
|
||||
price: Set("10.25".parse().unwrap()),
|
||||
gluten_free: Set(0),
|
||||
bakery_id: Set(Some(sea)),
|
||||
..Default::default()
|
||||
};
|
||||
let choco = Cake::insert(cake).exec(db).await?.last_insert_id;
|
||||
|
||||
let mut cake = cake::ActiveModel {
|
||||
name: Set("Double Chocolate".to_owned()),
|
||||
price: Set("12.5".parse().unwrap()),
|
||||
gluten_free: Set(0),
|
||||
bakery_id: Set(Some(sea)),
|
||||
..Default::default()
|
||||
};
|
||||
let double_1 = Cake::insert(cake.clone()).exec(db).await?.last_insert_id;
|
||||
cake.bakery_id = Set(Some(lake));
|
||||
let double_2 = Cake::insert(cake).exec(db).await?.last_insert_id;
|
||||
|
||||
let mut cake = cake::ActiveModel {
|
||||
name: Set("Lemon Cake".to_owned()),
|
||||
price: Set("8.8".parse().unwrap()),
|
||||
gluten_free: Set(0),
|
||||
bakery_id: Set(Some(sea)),
|
||||
..Default::default()
|
||||
};
|
||||
let lemon_1 = Cake::insert(cake.clone()).exec(db).await?.last_insert_id;
|
||||
cake.bakery_id = Set(Some(lake));
|
||||
let lemon_2 = Cake::insert(cake).exec(db).await?.last_insert_id;
|
||||
|
||||
let mut cake = cake::ActiveModel {
|
||||
name: Set("Strawberry Cake".to_owned()),
|
||||
price: Set("9.9".parse().unwrap()),
|
||||
gluten_free: Set(0),
|
||||
bakery_id: Set(Some(sea)),
|
||||
..Default::default()
|
||||
};
|
||||
let straw_1 = Cake::insert(cake.clone()).exec(db).await?.last_insert_id;
|
||||
cake.bakery_id = Set(Some(lake));
|
||||
let straw_2 = Cake::insert(cake).exec(db).await?.last_insert_id;
|
||||
|
||||
let cake = cake::ActiveModel {
|
||||
name: Set("Orange Cake".to_owned()),
|
||||
price: Set("6.5".parse().unwrap()),
|
||||
gluten_free: Set(1),
|
||||
bakery_id: Set(Some(lake)),
|
||||
..Default::default()
|
||||
};
|
||||
let orange = Cake::insert(cake).exec(db).await?.last_insert_id;
|
||||
|
||||
let mut cake = cake::ActiveModel {
|
||||
name: Set("New York Cheese".to_owned()),
|
||||
price: Set("12.5".parse().unwrap()),
|
||||
gluten_free: Set(0),
|
||||
bakery_id: Set(Some(sea)),
|
||||
..Default::default()
|
||||
};
|
||||
let cheese_1 = Cake::insert(cake.clone()).exec(db).await?.last_insert_id;
|
||||
cake.bakery_id = Set(Some(lake));
|
||||
let cheese_2 = Cake::insert(cake).exec(db).await?.last_insert_id;
|
||||
|
||||
let mut cake = cake::ActiveModel {
|
||||
name: Set("Blueburry Cheese".to_owned()),
|
||||
price: Set("11.5".parse().unwrap()),
|
||||
gluten_free: Set(1),
|
||||
bakery_id: Set(Some(sea)),
|
||||
..Default::default()
|
||||
};
|
||||
let blue_1 = Cake::insert(cake.clone()).exec(db).await?.last_insert_id;
|
||||
cake.bakery_id = Set(Some(lake));
|
||||
let blue_2 = Cake::insert(cake).exec(db).await?.last_insert_id;
|
||||
|
||||
let rel = cake_baker::ActiveModel {
|
||||
cake_id: Set(choco),
|
||||
baker_id: Set(alice),
|
||||
};
|
||||
CakeBaker::insert(rel).exec(db).await?;
|
||||
|
||||
let rel = cake_baker::ActiveModel {
|
||||
cake_id: Set(double_1),
|
||||
baker_id: Set(alice),
|
||||
};
|
||||
CakeBaker::insert(rel).exec(db).await?;
|
||||
let rel = cake_baker::ActiveModel {
|
||||
cake_id: Set(double_2),
|
||||
baker_id: Set(bob),
|
||||
};
|
||||
CakeBaker::insert(rel).exec(db).await?;
|
||||
|
||||
let rel = cake_baker::ActiveModel {
|
||||
cake_id: Set(lemon_1),
|
||||
baker_id: Set(alice),
|
||||
};
|
||||
CakeBaker::insert(rel).exec(db).await?;
|
||||
let rel = cake_baker::ActiveModel {
|
||||
cake_id: Set(lemon_2),
|
||||
baker_id: Set(bob),
|
||||
};
|
||||
CakeBaker::insert(rel).exec(db).await?;
|
||||
|
||||
let rel = cake_baker::ActiveModel {
|
||||
cake_id: Set(straw_1),
|
||||
baker_id: Set(alice),
|
||||
};
|
||||
CakeBaker::insert(rel).exec(db).await?;
|
||||
let rel = cake_baker::ActiveModel {
|
||||
cake_id: Set(straw_2),
|
||||
baker_id: Set(bob),
|
||||
};
|
||||
CakeBaker::insert(rel).exec(db).await?;
|
||||
|
||||
let rel = cake_baker::ActiveModel {
|
||||
cake_id: Set(orange),
|
||||
baker_id: Set(bob),
|
||||
};
|
||||
CakeBaker::insert(rel).exec(db).await?;
|
||||
|
||||
let rel = cake_baker::ActiveModel {
|
||||
cake_id: Set(cheese_1),
|
||||
baker_id: Set(alice),
|
||||
};
|
||||
CakeBaker::insert(rel).exec(db).await?;
|
||||
let rel = cake_baker::ActiveModel {
|
||||
cake_id: Set(cheese_2),
|
||||
baker_id: Set(bob),
|
||||
};
|
||||
CakeBaker::insert(rel).exec(db).await?;
|
||||
|
||||
let rel = cake_baker::ActiveModel {
|
||||
cake_id: Set(blue_1),
|
||||
baker_id: Set(alice),
|
||||
};
|
||||
CakeBaker::insert(rel).exec(db).await?;
|
||||
let rel = cake_baker::ActiveModel {
|
||||
cake_id: Set(blue_2),
|
||||
baker_id: Set(bob),
|
||||
};
|
||||
CakeBaker::insert(rel).exec(db).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||
let db = manager.get_connection();
|
||||
|
||||
Cake::delete_many().exec(db).await?;
|
||||
Baker::delete_many().exec(db).await?;
|
||||
Bakery::delete_many().exec(db).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
6
examples/seaography_example/migration/src/main.rs
Normal file
6
examples/seaography_example/migration/src/main.rs
Normal file
@ -0,0 +1,6 @@
|
||||
use sea_orm_migration::prelude::*;
|
||||
|
||||
#[async_std::main]
|
||||
async fn main() {
|
||||
cli::run_cli(migration::Migrator).await;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user