Examples with migration (#509)
* Update examples sea-orm version * Update example sea-schema version * Update [cli] sea-schema version * Fix [cli] cargo publish failed * Update CHANGELOG * Edit rocket example * Poem example with migration * Axum example with migration * Refactoring * Actix4 example with migration * Actix example with migration * Use sea_schema::migration::prelude
This commit is contained in:
parent
e9a460b47d
commit
f418c4e580
@ -1,3 +1,3 @@
|
|||||||
HOST=127.0.0.1
|
HOST=127.0.0.1
|
||||||
PORT=8000
|
PORT=8000
|
||||||
DATABASE_URL="mysql://root:@localhost/actix_example"
|
DATABASE_URL="mysql://root:root@localhost/actix_example"
|
||||||
|
@ -6,6 +6,7 @@ edition = "2021"
|
|||||||
publish = false
|
publish = false
|
||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
|
members = [".", "entity", "migration"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
actix-files = "0.6.0-beta.4"
|
actix-files = "0.6.0-beta.4"
|
||||||
@ -19,14 +20,5 @@ dotenv = "0.15"
|
|||||||
listenfd = "0.3.3"
|
listenfd = "0.3.3"
|
||||||
serde = "1"
|
serde = "1"
|
||||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||||
|
entity = { path = "entity" }
|
||||||
[dependencies.sea-orm]
|
migration = { path = "migration" }
|
||||||
path = "../../" # remove this line in your own project
|
|
||||||
version = "^0.6.0"
|
|
||||||
features = ["macros", "runtime-actix-native-tls", "debug-print"]
|
|
||||||
default-features = false
|
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["sqlx-mysql"]
|
|
||||||
sqlx-mysql = ["sea-orm/sqlx-mysql"]
|
|
||||||
sqlx-postgres = ["sea-orm/sqlx-postgres"]
|
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
|

|
||||||
|
|
||||||
# Actix 4 Beta with SeaORM example app
|
# Actix 4 Beta with SeaORM example app
|
||||||
|
|
||||||
Edit `Cargo.toml` to use `sqlx-mysql` or `sqlx-postgres`.
|
1. Modify the `DATABASE_URL` var in `.env` to point to your chosen database
|
||||||
|
|
||||||
```toml
|
1. Turn on the appropriate database feature for your chosen db in `entity/Cargo.toml` (the `"sqlx-mysql",` line)
|
||||||
[features]
|
|
||||||
default = ["sqlx-$DATABASE"]
|
|
||||||
```
|
|
||||||
|
|
||||||
Edit `.env` to point to your database.
|
1. Execute `cargo run` to start the server
|
||||||
|
|
||||||
|
1. Visit [localhost:8000](http://localhost:8000) in browser
|
||||||
|
|
||||||
Run server with auto-reloading:
|
Run server with auto-reloading:
|
||||||
|
|
||||||
|
BIN
examples/actix4_example/Screenshot.png
Normal file
BIN
examples/actix4_example/Screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 604 KiB |
25
examples/actix4_example/entity/Cargo.toml
Normal file
25
examples/actix4_example/entity/Cargo.toml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
[package]
|
||||||
|
name = "entity"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "entity"
|
||||||
|
path = "src/lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
serde = { version = "1", features = ["derive"] }
|
||||||
|
|
||||||
|
[dependencies.sea-orm]
|
||||||
|
# path = "../../../" # remove this line in your own project
|
||||||
|
version = "^0.6.0"
|
||||||
|
features = [
|
||||||
|
"macros",
|
||||||
|
"debug-print",
|
||||||
|
"runtime-actix-native-tls",
|
||||||
|
"sqlx-mysql",
|
||||||
|
# "sqlx-postgres",
|
||||||
|
# "sqlx-sqlite",
|
||||||
|
]
|
||||||
|
default-features = false
|
3
examples/actix4_example/entity/src/lib.rs
Normal file
3
examples/actix4_example/entity/src/lib.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
pub mod post;
|
||||||
|
|
||||||
|
pub use sea_orm;
|
13
examples/actix4_example/migration/Cargo.toml
Normal file
13
examples/actix4_example/migration/Cargo.toml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
[package]
|
||||||
|
name = "migration"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "migration"
|
||||||
|
path = "src/lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
sea-schema = { version = "^0.5.0", default-features = false, features = [ "migration", "debug-print" ] }
|
||||||
|
entity = { path = "../entity" }
|
37
examples/actix4_example/migration/README.md
Normal file
37
examples/actix4_example/migration/README.md
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# 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
|
||||||
|
```
|
12
examples/actix4_example/migration/src/lib.rs
Normal file
12
examples/actix4_example/migration/src/lib.rs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
pub use sea_schema::migration::prelude::*;
|
||||||
|
|
||||||
|
mod m20220120_000001_create_post_table;
|
||||||
|
|
||||||
|
pub struct Migrator;
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl MigratorTrait for Migrator {
|
||||||
|
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
|
||||||
|
vec![Box::new(m20220120_000001_create_post_table::Migration)]
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
use entity::post::*;
|
||||||
|
use sea_schema::migration::prelude::*;
|
||||||
|
|
||||||
|
pub struct Migration;
|
||||||
|
|
||||||
|
impl MigrationName for Migration {
|
||||||
|
fn name(&self) -> &str {
|
||||||
|
"m20220120_000001_create_post_table"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl MigrationTrait for Migration {
|
||||||
|
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||||
|
manager
|
||||||
|
.create_table(
|
||||||
|
Table::create()
|
||||||
|
.table(Entity)
|
||||||
|
.if_not_exists()
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(Column::Id)
|
||||||
|
.integer()
|
||||||
|
.not_null()
|
||||||
|
.auto_increment()
|
||||||
|
.primary_key(),
|
||||||
|
)
|
||||||
|
.col(ColumnDef::new(Column::Title).string().not_null())
|
||||||
|
.col(ColumnDef::new(Column::Text).string().not_null())
|
||||||
|
.to_owned(),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||||
|
manager
|
||||||
|
.drop_table(Table::drop().table(Entity).to_owned())
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
}
|
7
examples/actix4_example/migration/src/main.rs
Normal file
7
examples/actix4_example/migration/src/main.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
use migration::Migrator;
|
||||||
|
use sea_schema::migration::*;
|
||||||
|
|
||||||
|
#[async_std::main]
|
||||||
|
async fn main() {
|
||||||
|
cli::run_cli(Migrator).await;
|
||||||
|
}
|
@ -3,17 +3,17 @@ use actix_web::{
|
|||||||
error, get, middleware, post, web, App, Error, HttpRequest, HttpResponse, HttpServer, Result,
|
error, get, middleware, post, web, App, Error, HttpRequest, HttpResponse, HttpServer, Result,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use entity::post;
|
||||||
|
use entity::post::Entity as Post;
|
||||||
|
use entity::sea_orm;
|
||||||
use listenfd::ListenFd;
|
use listenfd::ListenFd;
|
||||||
|
use migration::{Migrator, MigratorTrait};
|
||||||
use sea_orm::DatabaseConnection;
|
use sea_orm::DatabaseConnection;
|
||||||
use sea_orm::{entity::*, query::*};
|
use sea_orm::{entity::*, query::*};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::env;
|
use std::env;
|
||||||
use tera::Tera;
|
use tera::Tera;
|
||||||
|
|
||||||
mod post;
|
|
||||||
pub use post::Entity as Post;
|
|
||||||
mod setup;
|
|
||||||
|
|
||||||
const DEFAULT_POSTS_PER_PAGE: usize = 5;
|
const DEFAULT_POSTS_PER_PAGE: usize = 5;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
@ -92,7 +92,9 @@ async fn create(
|
|||||||
.await
|
.await
|
||||||
.expect("could not insert post");
|
.expect("could not insert post");
|
||||||
|
|
||||||
Ok(HttpResponse::Found().append_header(("location", "/")).finish())
|
Ok(HttpResponse::Found()
|
||||||
|
.append_header(("location", "/"))
|
||||||
|
.finish())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[get("/{id}")]
|
#[get("/{id}")]
|
||||||
@ -133,7 +135,9 @@ async fn update(
|
|||||||
.await
|
.await
|
||||||
.expect("could not edit post");
|
.expect("could not edit post");
|
||||||
|
|
||||||
Ok(HttpResponse::Found().append_header(("location", "/")).finish())
|
Ok(HttpResponse::Found()
|
||||||
|
.append_header(("location", "/"))
|
||||||
|
.finish())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[post("/delete/{id}")]
|
#[post("/delete/{id}")]
|
||||||
@ -149,7 +153,9 @@ async fn delete(data: web::Data<AppState>, id: web::Path<i32>) -> Result<HttpRes
|
|||||||
|
|
||||||
post.delete(conn).await.unwrap();
|
post.delete(conn).await.unwrap();
|
||||||
|
|
||||||
Ok(HttpResponse::Found().append_header(("location", "/")).finish())
|
Ok(HttpResponse::Found()
|
||||||
|
.append_header(("location", "/"))
|
||||||
|
.finish())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_web::main]
|
#[actix_web::main]
|
||||||
@ -166,7 +172,7 @@ async fn main() -> std::io::Result<()> {
|
|||||||
|
|
||||||
// create post table if not exists
|
// create post table if not exists
|
||||||
let conn = sea_orm::Database::connect(&db_url).await.unwrap();
|
let conn = sea_orm::Database::connect(&db_url).await.unwrap();
|
||||||
let _ = setup::create_post_table(&conn).await;
|
Migrator::up(&conn, None).await.unwrap();
|
||||||
let templates = Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*")).unwrap();
|
let templates = Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*")).unwrap();
|
||||||
let state = AppState { templates, conn };
|
let state = AppState { templates, conn };
|
||||||
|
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
use sea_orm::sea_query::{ColumnDef, TableCreateStatement};
|
|
||||||
use sea_orm::{error::*, sea_query, ConnectionTrait, DbConn, ExecResult};
|
|
||||||
|
|
||||||
async fn create_table(db: &DbConn, stmt: &TableCreateStatement) -> Result<ExecResult, DbErr> {
|
|
||||||
let builder = db.get_database_backend();
|
|
||||||
db.execute(builder.build(stmt)).await
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn create_post_table(db: &DbConn) -> Result<ExecResult, DbErr> {
|
|
||||||
let stmt = sea_query::Table::create()
|
|
||||||
.table(super::post::Entity)
|
|
||||||
.if_not_exists()
|
|
||||||
.col(
|
|
||||||
ColumnDef::new(super::post::Column::Id)
|
|
||||||
.integer()
|
|
||||||
.not_null()
|
|
||||||
.auto_increment()
|
|
||||||
.primary_key(),
|
|
||||||
)
|
|
||||||
.col(
|
|
||||||
ColumnDef::new(super::post::Column::Title)
|
|
||||||
.string()
|
|
||||||
.not_null(),
|
|
||||||
)
|
|
||||||
.col(
|
|
||||||
ColumnDef::new(super::post::Column::Text)
|
|
||||||
.string()
|
|
||||||
.not_null(),
|
|
||||||
)
|
|
||||||
.to_owned();
|
|
||||||
|
|
||||||
create_table(db, &stmt).await
|
|
||||||
}
|
|
@ -1,3 +1,3 @@
|
|||||||
HOST=127.0.0.1
|
HOST=127.0.0.1
|
||||||
PORT=8000
|
PORT=8000
|
||||||
DATABASE_URL="sql://root:@localhost/actix_example"
|
DATABASE_URL="mysql://root:root@localhost/actix_example"
|
@ -6,6 +6,7 @@ edition = "2021"
|
|||||||
publish = false
|
publish = false
|
||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
|
members = [".", "entity", "migration"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
actix-http = "2"
|
actix-http = "2"
|
||||||
@ -19,14 +20,5 @@ dotenv = "0.15"
|
|||||||
listenfd = "0.3.3"
|
listenfd = "0.3.3"
|
||||||
serde = "1"
|
serde = "1"
|
||||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||||
|
entity = { path = "entity" }
|
||||||
[dependencies.sea-orm]
|
migration = { path = "migration" }
|
||||||
path = "../../" # remove this line in your own project
|
|
||||||
version = "^0.6.0"
|
|
||||||
features = ["macros", "runtime-async-std-native-tls", "debug-print"]
|
|
||||||
default-features = false
|
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["sqlx-mysql"]
|
|
||||||
sqlx-mysql = ["sea-orm/sqlx-mysql"]
|
|
||||||
sqlx-postgres = ["sea-orm/sqlx-postgres"]
|
|
||||||
|
@ -1,13 +1,14 @@
|
|||||||
|

|
||||||
|
|
||||||
# Actix with SeaORM example app
|
# Actix with SeaORM example app
|
||||||
|
|
||||||
Edit `Cargo.toml` to use `sqlx-mysql` or `sqlx-postgres`.
|
1. Modify the `DATABASE_URL` var in `.env` to point to your chosen database
|
||||||
|
|
||||||
```toml
|
1. Turn on the appropriate database feature for your chosen db in `entity/Cargo.toml` (the `"sqlx-mysql",` line)
|
||||||
[features]
|
|
||||||
default = ["sqlx-$DATABASE"]
|
|
||||||
```
|
|
||||||
|
|
||||||
Edit `.env` to point to your database.
|
1. Execute `cargo run` to start the server
|
||||||
|
|
||||||
|
1. Visit [localhost:8000](http://localhost:8000) in browser
|
||||||
|
|
||||||
Run server with auto-reloading:
|
Run server with auto-reloading:
|
||||||
|
|
||||||
|
BIN
examples/actix_example/Screenshot.png
Normal file
BIN
examples/actix_example/Screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 604 KiB |
25
examples/actix_example/entity/Cargo.toml
Normal file
25
examples/actix_example/entity/Cargo.toml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
[package]
|
||||||
|
name = "entity"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "entity"
|
||||||
|
path = "src/lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
serde = { version = "1", features = ["derive"] }
|
||||||
|
|
||||||
|
[dependencies.sea-orm]
|
||||||
|
# path = "../../../" # remove this line in your own project
|
||||||
|
version = "^0.6.0"
|
||||||
|
features = [
|
||||||
|
"macros",
|
||||||
|
"debug-print",
|
||||||
|
"runtime-async-std-native-tls",
|
||||||
|
"sqlx-mysql",
|
||||||
|
# "sqlx-postgres",
|
||||||
|
# "sqlx-sqlite",
|
||||||
|
]
|
||||||
|
default-features = false
|
3
examples/actix_example/entity/src/lib.rs
Normal file
3
examples/actix_example/entity/src/lib.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
pub mod post;
|
||||||
|
|
||||||
|
pub use sea_orm;
|
13
examples/actix_example/migration/Cargo.toml
Normal file
13
examples/actix_example/migration/Cargo.toml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
[package]
|
||||||
|
name = "migration"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "migration"
|
||||||
|
path = "src/lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
sea-schema = { version = "^0.5.0", default-features = false, features = [ "migration", "debug-print" ] }
|
||||||
|
entity = { path = "../entity" }
|
37
examples/actix_example/migration/README.md
Normal file
37
examples/actix_example/migration/README.md
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# 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
|
||||||
|
```
|
12
examples/actix_example/migration/src/lib.rs
Normal file
12
examples/actix_example/migration/src/lib.rs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
pub use sea_schema::migration::prelude::*;
|
||||||
|
|
||||||
|
mod m20220120_000001_create_post_table;
|
||||||
|
|
||||||
|
pub struct Migrator;
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl MigratorTrait for Migrator {
|
||||||
|
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
|
||||||
|
vec![Box::new(m20220120_000001_create_post_table::Migration)]
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
use entity::post::*;
|
||||||
|
use sea_schema::migration::prelude::*;
|
||||||
|
|
||||||
|
pub struct Migration;
|
||||||
|
|
||||||
|
impl MigrationName for Migration {
|
||||||
|
fn name(&self) -> &str {
|
||||||
|
"m20220120_000001_create_post_table"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl MigrationTrait for Migration {
|
||||||
|
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||||
|
manager
|
||||||
|
.create_table(
|
||||||
|
Table::create()
|
||||||
|
.table(Entity)
|
||||||
|
.if_not_exists()
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(Column::Id)
|
||||||
|
.integer()
|
||||||
|
.not_null()
|
||||||
|
.auto_increment()
|
||||||
|
.primary_key(),
|
||||||
|
)
|
||||||
|
.col(ColumnDef::new(Column::Title).string().not_null())
|
||||||
|
.col(ColumnDef::new(Column::Text).string().not_null())
|
||||||
|
.to_owned(),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||||
|
manager
|
||||||
|
.drop_table(Table::drop().table(Entity).to_owned())
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
}
|
7
examples/actix_example/migration/src/main.rs
Normal file
7
examples/actix_example/migration/src/main.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
use migration::Migrator;
|
||||||
|
use sea_schema::migration::*;
|
||||||
|
|
||||||
|
#[async_std::main]
|
||||||
|
async fn main() {
|
||||||
|
cli::run_cli(Migrator).await;
|
||||||
|
}
|
@ -2,17 +2,18 @@ use actix_files as fs;
|
|||||||
use actix_web::{
|
use actix_web::{
|
||||||
error, get, middleware, post, web, App, Error, HttpRequest, HttpResponse, HttpServer, Result,
|
error, get, middleware, post, web, App, Error, HttpRequest, HttpResponse, HttpServer, Result,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use entity::post;
|
||||||
|
use entity::post::Entity as Post;
|
||||||
|
use entity::sea_orm;
|
||||||
use listenfd::ListenFd;
|
use listenfd::ListenFd;
|
||||||
|
use migration::{Migrator, MigratorTrait};
|
||||||
use sea_orm::DatabaseConnection;
|
use sea_orm::DatabaseConnection;
|
||||||
use sea_orm::{entity::*, query::*};
|
use sea_orm::{entity::*, query::*};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::env;
|
use std::env;
|
||||||
use tera::Tera;
|
use tera::Tera;
|
||||||
|
|
||||||
mod post;
|
|
||||||
pub use post::Entity as Post;
|
|
||||||
mod setup;
|
|
||||||
|
|
||||||
const DEFAULT_POSTS_PER_PAGE: usize = 5;
|
const DEFAULT_POSTS_PER_PAGE: usize = 5;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
@ -192,7 +193,7 @@ async fn main() -> std::io::Result<()> {
|
|||||||
|
|
||||||
// create post table if not exists
|
// create post table if not exists
|
||||||
let conn = sea_orm::Database::connect(&db_url).await.unwrap();
|
let conn = sea_orm::Database::connect(&db_url).await.unwrap();
|
||||||
let _ = setup::create_post_table(&conn).await;
|
Migrator::up(&conn, None).await.unwrap();
|
||||||
let templates = Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*")).unwrap();
|
let templates = Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*")).unwrap();
|
||||||
let state = AppState { templates, conn };
|
let state = AppState { templates, conn };
|
||||||
|
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
use sea_orm::sea_query::{ColumnDef, TableCreateStatement};
|
|
||||||
use sea_orm::{error::*, sea_query, ConnectionTrait, DbConn, ExecResult};
|
|
||||||
|
|
||||||
async fn create_table(db: &DbConn, stmt: &TableCreateStatement) -> Result<ExecResult, DbErr> {
|
|
||||||
let builder = db.get_database_backend();
|
|
||||||
db.execute(builder.build(stmt)).await
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn create_post_table(db: &DbConn) -> Result<ExecResult, DbErr> {
|
|
||||||
let stmt = sea_query::Table::create()
|
|
||||||
.table(super::post::Entity)
|
|
||||||
.if_not_exists()
|
|
||||||
.col(
|
|
||||||
ColumnDef::new(super::post::Column::Id)
|
|
||||||
.integer()
|
|
||||||
.not_null()
|
|
||||||
.auto_increment()
|
|
||||||
.primary_key(),
|
|
||||||
)
|
|
||||||
.col(
|
|
||||||
ColumnDef::new(super::post::Column::Title)
|
|
||||||
.string()
|
|
||||||
.not_null(),
|
|
||||||
)
|
|
||||||
.col(
|
|
||||||
ColumnDef::new(super::post::Column::Text)
|
|
||||||
.string()
|
|
||||||
.not_null(),
|
|
||||||
)
|
|
||||||
.to_owned();
|
|
||||||
|
|
||||||
create_table(db, &stmt).await
|
|
||||||
}
|
|
@ -1,3 +1,3 @@
|
|||||||
HOST=127.0.0.1
|
HOST=127.0.0.1
|
||||||
PORT=8000
|
PORT=8000
|
||||||
DATABASE_URL="postgres://postgres:password@localhost/axum_exmaple"
|
DATABASE_URL="postgres://root:root@localhost/axum_exmaple"
|
@ -7,6 +7,7 @@ publish = false
|
|||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
[workspace]
|
[workspace]
|
||||||
|
members = [".", "entity", "migration"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
tokio = { version = "1.14", features = ["full"] }
|
tokio = { version = "1.14", features = ["full"] }
|
||||||
@ -20,14 +21,5 @@ serde = "1"
|
|||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
tera = "1"
|
tera = "1"
|
||||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||||
|
entity = { path = "entity" }
|
||||||
[dependencies.sea-orm]
|
migration = { path = "migration" }
|
||||||
path = "../../" # remove this line in your own project
|
|
||||||
version = "^0.6.0"
|
|
||||||
features = ["macros", "runtime-tokio-native-tls", "debug-print"]
|
|
||||||
default-features = false
|
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["sqlx-postgres"]
|
|
||||||
sqlx-mysql = ["sea-orm/sqlx-mysql"]
|
|
||||||
sqlx-postgres = ["sea-orm/sqlx-postgres"]
|
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
|

|
||||||
|
|
||||||
# Axum with SeaORM example app
|
# Axum with SeaORM example app
|
||||||
|
|
||||||
Edit `Cargo.toml` to use `sqlx-mysql` or `sqlx-postgres`.
|
1. Modify the `DATABASE_URL` var in `.env` to point to your chosen database
|
||||||
|
|
||||||
```toml
|
1. Turn on the appropriate database feature for your chosen db in `entity/Cargo.toml` (the `"sqlx-postgres",` line)
|
||||||
[features]
|
|
||||||
default = ["sqlx-$DATABASE"]
|
|
||||||
```
|
|
||||||
|
|
||||||
Edit `.env` to point to your database.
|
1. Execute `cargo run` to start the server
|
||||||
|
|
||||||
|
1. Visit [localhost:8000](http://localhost:8000) in browser
|
||||||
|
BIN
examples/axum_example/Screenshot.png
Normal file
BIN
examples/axum_example/Screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 610 KiB |
25
examples/axum_example/entity/Cargo.toml
Normal file
25
examples/axum_example/entity/Cargo.toml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
[package]
|
||||||
|
name = "entity"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "entity"
|
||||||
|
path = "src/lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
serde = { version = "1", features = ["derive"] }
|
||||||
|
|
||||||
|
[dependencies.sea-orm]
|
||||||
|
# path = "../../../" # remove this line in your own project
|
||||||
|
version = "^0.6.0"
|
||||||
|
features = [
|
||||||
|
"macros",
|
||||||
|
"debug-print",
|
||||||
|
"runtime-tokio-native-tls",
|
||||||
|
"sqlx-postgres",
|
||||||
|
# "sqlx-mysql",
|
||||||
|
# "sqlx-sqlite",
|
||||||
|
]
|
||||||
|
default-features = false
|
3
examples/axum_example/entity/src/lib.rs
Normal file
3
examples/axum_example/entity/src/lib.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
pub mod post;
|
||||||
|
|
||||||
|
pub use sea_orm;
|
13
examples/axum_example/migration/Cargo.toml
Normal file
13
examples/axum_example/migration/Cargo.toml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
[package]
|
||||||
|
name = "migration"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "migration"
|
||||||
|
path = "src/lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
sea-schema = { version = "^0.5.0", default-features = false, features = [ "migration", "debug-print" ] }
|
||||||
|
entity = { path = "../entity" }
|
37
examples/axum_example/migration/README.md
Normal file
37
examples/axum_example/migration/README.md
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# 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
|
||||||
|
```
|
12
examples/axum_example/migration/src/lib.rs
Normal file
12
examples/axum_example/migration/src/lib.rs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
pub use sea_schema::migration::prelude::*;
|
||||||
|
|
||||||
|
mod m20220120_000001_create_post_table;
|
||||||
|
|
||||||
|
pub struct Migrator;
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl MigratorTrait for Migrator {
|
||||||
|
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
|
||||||
|
vec![Box::new(m20220120_000001_create_post_table::Migration)]
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
use entity::post::*;
|
||||||
|
use sea_schema::migration::prelude::*;
|
||||||
|
|
||||||
|
pub struct Migration;
|
||||||
|
|
||||||
|
impl MigrationName for Migration {
|
||||||
|
fn name(&self) -> &str {
|
||||||
|
"m20220120_000001_create_post_table"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl MigrationTrait for Migration {
|
||||||
|
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||||
|
manager
|
||||||
|
.create_table(
|
||||||
|
Table::create()
|
||||||
|
.table(Entity)
|
||||||
|
.if_not_exists()
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(Column::Id)
|
||||||
|
.integer()
|
||||||
|
.not_null()
|
||||||
|
.auto_increment()
|
||||||
|
.primary_key(),
|
||||||
|
)
|
||||||
|
.col(ColumnDef::new(Column::Title).string().not_null())
|
||||||
|
.col(ColumnDef::new(Column::Text).string().not_null())
|
||||||
|
.to_owned(),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||||
|
manager
|
||||||
|
.drop_table(Table::drop().table(Entity).to_owned())
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
}
|
7
examples/axum_example/migration/src/main.rs
Normal file
7
examples/axum_example/migration/src/main.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
use migration::Migrator;
|
||||||
|
use sea_schema::migration::*;
|
||||||
|
|
||||||
|
#[async_std::main]
|
||||||
|
async fn main() {
|
||||||
|
cli::run_cli(Migrator).await;
|
||||||
|
}
|
@ -1,15 +1,16 @@
|
|||||||
mod flash;
|
mod flash;
|
||||||
mod post;
|
|
||||||
mod setup;
|
|
||||||
|
|
||||||
use axum::{
|
use axum::{
|
||||||
extract::{Extension, Form, Path, Query},
|
extract::{Extension, Form, Path, Query},
|
||||||
http::StatusCode,
|
http::StatusCode,
|
||||||
response::Html,
|
response::Html,
|
||||||
routing::{get, post, get_service},
|
routing::{get, get_service, post},
|
||||||
AddExtensionLayer, Router, Server,
|
AddExtensionLayer, Router, Server,
|
||||||
};
|
};
|
||||||
|
use entity::post;
|
||||||
|
use entity::sea_orm;
|
||||||
use flash::{get_flash_cookie, post_response, PostResponse};
|
use flash::{get_flash_cookie, post_response, PostResponse};
|
||||||
|
use migration::{Migrator, MigratorTrait};
|
||||||
use post::Entity as Post;
|
use post::Entity as Post;
|
||||||
use sea_orm::{prelude::*, Database, QueryOrder, Set};
|
use sea_orm::{prelude::*, Database, QueryOrder, Set};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@ -34,7 +35,7 @@ async fn main() -> anyhow::Result<()> {
|
|||||||
let conn = Database::connect(db_url)
|
let conn = Database::connect(db_url)
|
||||||
.await
|
.await
|
||||||
.expect("Database connection failed");
|
.expect("Database connection failed");
|
||||||
let _ = setup::create_post_table(&conn).await;
|
Migrator::up(&conn, None).await.unwrap();
|
||||||
let templates = Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*"))
|
let templates = Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*"))
|
||||||
.expect("Tera initialization failed");
|
.expect("Tera initialization failed");
|
||||||
// let state = AppState { templates, conn };
|
// let state = AppState { templates, conn };
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
use sea_orm::sea_query::{ColumnDef, TableCreateStatement};
|
|
||||||
use sea_orm::{error::*, sea_query, ConnectionTrait, DbConn, ExecResult};
|
|
||||||
|
|
||||||
async fn create_table(db: &DbConn, stmt: &TableCreateStatement) -> Result<ExecResult, DbErr> {
|
|
||||||
let builder = db.get_database_backend();
|
|
||||||
db.execute(builder.build(stmt)).await
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn create_post_table(db: &DbConn) -> Result<ExecResult, DbErr> {
|
|
||||||
let stmt = sea_query::Table::create()
|
|
||||||
.table(super::post::Entity)
|
|
||||||
.if_not_exists()
|
|
||||||
.col(
|
|
||||||
ColumnDef::new(super::post::Column::Id)
|
|
||||||
.integer()
|
|
||||||
.not_null()
|
|
||||||
.auto_increment()
|
|
||||||
.primary_key(),
|
|
||||||
)
|
|
||||||
.col(
|
|
||||||
ColumnDef::new(super::post::Column::Title)
|
|
||||||
.string()
|
|
||||||
.not_null(),
|
|
||||||
)
|
|
||||||
.col(
|
|
||||||
ColumnDef::new(super::post::Column::Text)
|
|
||||||
.string()
|
|
||||||
.not_null(),
|
|
||||||
)
|
|
||||||
.to_owned();
|
|
||||||
|
|
||||||
create_table(db, &stmt).await
|
|
||||||
}
|
|
@ -5,6 +5,7 @@ edition = "2021"
|
|||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
[workspace]
|
[workspace]
|
||||||
|
members = [".", "entity", "migration"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
tokio = { version = "1.15.0", features = ["macros", "rt-multi-thread"] }
|
tokio = { version = "1.15.0", features = ["macros", "rt-multi-thread"] }
|
||||||
@ -13,15 +14,5 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
|||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
tera = "1.8.0"
|
tera = "1.8.0"
|
||||||
dotenv = "0.15"
|
dotenv = "0.15"
|
||||||
|
entity = { path = "entity" }
|
||||||
[dependencies.sea-orm]
|
migration = { path = "migration" }
|
||||||
path = "../../" # remove this line in your own project
|
|
||||||
version = "^0.6.0"
|
|
||||||
features = ["macros", "runtime-tokio-native-tls", "debug-print"]
|
|
||||||
default-features = false
|
|
||||||
|
|
||||||
[features]
|
|
||||||
default = ["sqlx-sqlite"]
|
|
||||||
sqlx-mysql = ["sea-orm/sqlx-mysql"]
|
|
||||||
sqlx-postgres = ["sea-orm/sqlx-postgres"]
|
|
||||||
sqlx-sqlite = ["sea-orm/sqlx-sqlite"]
|
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
|

|
||||||
|
|
||||||
# Poem with SeaORM example app
|
# Poem with SeaORM example app
|
||||||
|
|
||||||
Edit `Cargo.toml` to use `sqlx-mysql` or `sqlx-postgres`.
|
1. Modify the `DATABASE_URL` var in `.env` to point to your chosen database
|
||||||
|
|
||||||
```toml
|
1. Turn on the appropriate database feature for your chosen db in `entity/Cargo.toml` (the `"sqlx-sqlite",` line)
|
||||||
[features]
|
|
||||||
default = ["sqlx-$DATABASE"]
|
|
||||||
```
|
|
||||||
|
|
||||||
Edit `.env` to point to your database.
|
1. Execute `cargo run` to start the server
|
||||||
|
|
||||||
|
1. Visit [localhost:8000](http://localhost:8000) in browser after seeing the `server started` line
|
||||||
|
BIN
examples/poem_example/Screenshot.png
Normal file
BIN
examples/poem_example/Screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 604 KiB |
25
examples/poem_example/entity/Cargo.toml
Normal file
25
examples/poem_example/entity/Cargo.toml
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
[package]
|
||||||
|
name = "entity"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "entity"
|
||||||
|
path = "src/lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
serde = { version = "1", features = ["derive"] }
|
||||||
|
|
||||||
|
[dependencies.sea-orm]
|
||||||
|
# path = "../../../" # remove this line in your own project
|
||||||
|
version = "^0.6.0"
|
||||||
|
features = [
|
||||||
|
"macros",
|
||||||
|
"debug-print",
|
||||||
|
"runtime-tokio-native-tls",
|
||||||
|
"sqlx-sqlite",
|
||||||
|
# "sqlx-postgres",
|
||||||
|
# "sqlx-mysql",
|
||||||
|
]
|
||||||
|
default-features = false
|
3
examples/poem_example/entity/src/lib.rs
Normal file
3
examples/poem_example/entity/src/lib.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
pub mod post;
|
||||||
|
|
||||||
|
pub use sea_orm;
|
13
examples/poem_example/migration/Cargo.toml
Normal file
13
examples/poem_example/migration/Cargo.toml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
[package]
|
||||||
|
name = "migration"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
publish = false
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "migration"
|
||||||
|
path = "src/lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
sea-schema = { version = "^0.5.0", default-features = false, features = [ "migration", "debug-print" ] }
|
||||||
|
entity = { path = "../entity" }
|
37
examples/poem_example/migration/README.md
Normal file
37
examples/poem_example/migration/README.md
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# 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
|
||||||
|
```
|
12
examples/poem_example/migration/src/lib.rs
Normal file
12
examples/poem_example/migration/src/lib.rs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
pub use sea_schema::migration::prelude::*;
|
||||||
|
|
||||||
|
mod m20220120_000001_create_post_table;
|
||||||
|
|
||||||
|
pub struct Migrator;
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl MigratorTrait for Migrator {
|
||||||
|
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
|
||||||
|
vec![Box::new(m20220120_000001_create_post_table::Migration)]
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
use entity::post::*;
|
||||||
|
use sea_schema::migration::prelude::*;
|
||||||
|
|
||||||
|
pub struct Migration;
|
||||||
|
|
||||||
|
impl MigrationName for Migration {
|
||||||
|
fn name(&self) -> &str {
|
||||||
|
"m20220120_000001_create_post_table"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl MigrationTrait for Migration {
|
||||||
|
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||||
|
manager
|
||||||
|
.create_table(
|
||||||
|
Table::create()
|
||||||
|
.table(Entity)
|
||||||
|
.if_not_exists()
|
||||||
|
.col(
|
||||||
|
ColumnDef::new(Column::Id)
|
||||||
|
.integer()
|
||||||
|
.not_null()
|
||||||
|
.auto_increment()
|
||||||
|
.primary_key(),
|
||||||
|
)
|
||||||
|
.col(ColumnDef::new(Column::Title).string().not_null())
|
||||||
|
.col(ColumnDef::new(Column::Text).string().not_null())
|
||||||
|
.to_owned(),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
|
||||||
|
manager
|
||||||
|
.drop_table(Table::drop().table(Entity).to_owned())
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
}
|
7
examples/poem_example/migration/src/main.rs
Normal file
7
examples/poem_example/migration/src/main.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
use migration::Migrator;
|
||||||
|
use sea_schema::migration::*;
|
||||||
|
|
||||||
|
#[async_std::main]
|
||||||
|
async fn main() {
|
||||||
|
cli::run_cli(Migrator).await;
|
||||||
|
}
|
@ -1,5 +1,8 @@
|
|||||||
use std::env;
|
use std::env;
|
||||||
|
|
||||||
|
use entity::post;
|
||||||
|
use entity::sea_orm;
|
||||||
|
use migration::{Migrator, MigratorTrait};
|
||||||
use poem::endpoint::StaticFilesEndpoint;
|
use poem::endpoint::StaticFilesEndpoint;
|
||||||
use poem::error::{BadRequest, InternalServerError};
|
use poem::error::{BadRequest, InternalServerError};
|
||||||
use poem::http::StatusCode;
|
use poem::http::StatusCode;
|
||||||
@ -10,9 +13,6 @@ use sea_orm::{entity::*, query::*, DatabaseConnection};
|
|||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use tera::Tera;
|
use tera::Tera;
|
||||||
|
|
||||||
mod post;
|
|
||||||
mod setup;
|
|
||||||
|
|
||||||
const DEFAULT_POSTS_PER_PAGE: usize = 5;
|
const DEFAULT_POSTS_PER_PAGE: usize = 5;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
@ -142,7 +142,7 @@ async fn main() -> std::io::Result<()> {
|
|||||||
|
|
||||||
// create post table if not exists
|
// create post table if not exists
|
||||||
let conn = sea_orm::Database::connect(&db_url).await.unwrap();
|
let conn = sea_orm::Database::connect(&db_url).await.unwrap();
|
||||||
let _ = setup::create_post_table(&conn).await;
|
Migrator::up(&conn, None).await.unwrap();
|
||||||
let templates = Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*")).unwrap();
|
let templates = Tera::new(concat!(env!("CARGO_MANIFEST_DIR"), "/templates/**/*")).unwrap();
|
||||||
let state = AppState { templates, conn };
|
let state = AppState { templates, conn };
|
||||||
|
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
use sea_orm::sea_query::{ColumnDef, TableCreateStatement};
|
|
||||||
use sea_orm::{error::*, sea_query, ConnectionTrait, DbConn, ExecResult};
|
|
||||||
|
|
||||||
async fn create_table(db: &DbConn, stmt: &TableCreateStatement) -> Result<ExecResult, DbErr> {
|
|
||||||
let builder = db.get_database_backend();
|
|
||||||
db.execute(builder.build(stmt)).await
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn create_post_table(db: &DbConn) -> Result<ExecResult, DbErr> {
|
|
||||||
let stmt = sea_query::Table::create()
|
|
||||||
.table(super::post::Entity)
|
|
||||||
.if_not_exists()
|
|
||||||
.col(
|
|
||||||
ColumnDef::new(super::post::Column::Id)
|
|
||||||
.integer()
|
|
||||||
.not_null()
|
|
||||||
.auto_increment()
|
|
||||||
.primary_key(),
|
|
||||||
)
|
|
||||||
.col(
|
|
||||||
ColumnDef::new(super::post::Column::Title)
|
|
||||||
.string()
|
|
||||||
.not_null(),
|
|
||||||
)
|
|
||||||
.col(
|
|
||||||
ColumnDef::new(super::post::Column::Text)
|
|
||||||
.string()
|
|
||||||
.not_null(),
|
|
||||||
)
|
|
||||||
.to_owned();
|
|
||||||
|
|
||||||
create_table(db, &stmt).await
|
|
||||||
}
|
|
@ -2,7 +2,7 @@
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<title>Actix Example</title>
|
<title>Poem Example</title>
|
||||||
<meta name="description" content="Actix - SeaOrm integration example" />
|
<meta name="description" content="Actix - SeaOrm integration example" />
|
||||||
<meta name="author" content="Sam Samai" />
|
<meta name="author" content="Sam Samai" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
@ -6,6 +6,6 @@
|
|||||||
|
|
||||||
1. Turn on the appropriate database feature for your chosen db in `entity/Cargo.toml` (the `"sqlx-postgres",` line)
|
1. Turn on the appropriate database feature for your chosen db in `entity/Cargo.toml` (the `"sqlx-postgres",` line)
|
||||||
|
|
||||||
1. `cargo run` to start the server
|
1. Execute `cargo run` to start the server
|
||||||
|
|
||||||
1. Open in browser after seeing the `🚀 Rocket has launched from http://localhost:8000` line
|
1. Visit [localhost:8000](http://localhost:8000) in browser after seeing the `🚀 Rocket has launched from http://localhost:8000` line
|
||||||
|
@ -21,5 +21,6 @@ features = [
|
|||||||
"runtime-tokio-native-tls",
|
"runtime-tokio-native-tls",
|
||||||
"sqlx-postgres",
|
"sqlx-postgres",
|
||||||
# "sqlx-mysql",
|
# "sqlx-mysql",
|
||||||
|
# "sqlx-sqlite",
|
||||||
]
|
]
|
||||||
default-features = false
|
default-features = false
|
Loading…
x
Reference in New Issue
Block a user