pub trait Model:
Sized
+ Send
+ Sync
+ Unpin
+ 'static {
const TABLE: &'static str;
const COLUMNS: &'static [&'static str];
const INSERT_COLUMNS: &'static [&'static str];
// Required methods
fn id(&self) -> i64;
fn from_row(row: Row<'_>) -> Result<Self, Error>;
fn insert_values(&self) -> Vec<Value>;
// Provided methods
fn find(
db: &Db,
id: i64,
) -> impl Future<Output = Result<Option<Self>, Error>> + Send
where Self: Send { ... }
fn all(db: &Db) -> impl Future<Output = Result<Vec<Self>, Error>> + Send { ... }
fn create<'a>(
&'a self,
db: &'a Db,
) -> impl Future<Output = Result<i64, Error>> + Send + 'a { ... }
fn update<'a>(
&'a self,
db: &'a Db,
) -> impl Future<Output = Result<(), Error>> + Send + 'a { ... }
fn delete(
db: &Db,
id: i64,
) -> impl Future<Output = Result<(), Error>> + Send { ... }
}Required Associated Constants§
const TABLE: &'static str
const COLUMNS: &'static [&'static str]
const INSERT_COLUMNS: &'static [&'static str]
Required Methods§
fn id(&self) -> i64
fn from_row(row: Row<'_>) -> Result<Self, Error>
fn insert_values(&self) -> Vec<Value>
Provided Methods§
Sourcefn find(
db: &Db,
id: i64,
) -> impl Future<Output = Result<Option<Self>, Error>> + Sendwhere
Self: Send,
fn find(
db: &Db,
id: i64,
) -> impl Future<Output = Result<Option<Self>, Error>> + Sendwhere
Self: Send,
Examples found in repository?
examples/orm_demo.rs (line 60)
33async fn main() -> Result<(), Error> {
34 let db = Db::memory().await?;
35 db.execute(
36 "CREATE TABLE users (
37 id INTEGER PRIMARY KEY AUTOINCREMENT,
38 name TEXT NOT NULL,
39 is_admin INTEGER NOT NULL
40 )",
41 )
42 .await?;
43
44 let alice_id = User {
45 id: 0,
46 name: "Alice".into(),
47 is_admin: false,
48 }
49 .create(&db)
50 .await?;
51 let bob_id = User {
52 id: 0,
53 name: "Bob".into(),
54 is_admin: true,
55 }
56 .create(&db)
57 .await?;
58 println!("created ids: alice={alice_id} bob={bob_id}");
59
60 let alice = User::find(&db, alice_id).await?.expect("alice");
61 println!("find alice: {alice:?}");
62
63 let all = User::all(&db).await?;
64 println!("all: {all:?}");
65
66 let renamed = User {
67 id: alice_id,
68 name: "Alicia".into(),
69 is_admin: false,
70 };
71 renamed.update(&db).await?;
72 let after_update = User::find(&db, alice_id).await?.unwrap();
73 println!("after update: {after_update:?}");
74
75 User::delete(&db, bob_id).await?;
76 println!("remaining after delete bob: {:?}", User::all(&db).await?);
77
78 Ok(())
79}Sourcefn all(db: &Db) -> impl Future<Output = Result<Vec<Self>, Error>> + Send
fn all(db: &Db) -> impl Future<Output = Result<Vec<Self>, Error>> + Send
Examples found in repository?
examples/orm_demo.rs (line 63)
33async fn main() -> Result<(), Error> {
34 let db = Db::memory().await?;
35 db.execute(
36 "CREATE TABLE users (
37 id INTEGER PRIMARY KEY AUTOINCREMENT,
38 name TEXT NOT NULL,
39 is_admin INTEGER NOT NULL
40 )",
41 )
42 .await?;
43
44 let alice_id = User {
45 id: 0,
46 name: "Alice".into(),
47 is_admin: false,
48 }
49 .create(&db)
50 .await?;
51 let bob_id = User {
52 id: 0,
53 name: "Bob".into(),
54 is_admin: true,
55 }
56 .create(&db)
57 .await?;
58 println!("created ids: alice={alice_id} bob={bob_id}");
59
60 let alice = User::find(&db, alice_id).await?.expect("alice");
61 println!("find alice: {alice:?}");
62
63 let all = User::all(&db).await?;
64 println!("all: {all:?}");
65
66 let renamed = User {
67 id: alice_id,
68 name: "Alicia".into(),
69 is_admin: false,
70 };
71 renamed.update(&db).await?;
72 let after_update = User::find(&db, alice_id).await?.unwrap();
73 println!("after update: {after_update:?}");
74
75 User::delete(&db, bob_id).await?;
76 println!("remaining after delete bob: {:?}", User::all(&db).await?);
77
78 Ok(())
79}Sourcefn create<'a>(
&'a self,
db: &'a Db,
) -> impl Future<Output = Result<i64, Error>> + Send + 'a
fn create<'a>( &'a self, db: &'a Db, ) -> impl Future<Output = Result<i64, Error>> + Send + 'a
Examples found in repository?
examples/admin_demo.rs (line 55)
38async fn main() -> std::io::Result<()> {
39 let db = Db::memory().await.expect("db connect");
40 db.execute(
41 "CREATE TABLE users (
42 id INTEGER PRIMARY KEY AUTOINCREMENT,
43 name TEXT NOT NULL,
44 is_admin INTEGER NOT NULL
45 )",
46 )
47 .await
48 .expect("create schema");
49
50 User {
51 id: 0,
52 name: "Alice".into(),
53 is_admin: false,
54 }
55 .create(&db)
56 .await
57 .expect("seed alice");
58 User {
59 id: 0,
60 name: "Bob".into(),
61 is_admin: true,
62 }
63 .create(&db)
64 .await
65 .expect("seed bob");
66
67 let router = with_defaults(Router::new()).wrap(authenticate);
68 let router = admin::register::<User>(router, &db);
69
70 let addr: SocketAddr = ([127, 0, 0, 1], 3000).into();
71 eprintln!("admin demo: hit /admin/users with `Authorization: Bearer dev-admin` header");
72 Server::bind(addr).serve_router(router).await
73}More examples
examples/orm_demo.rs (line 49)
33async fn main() -> Result<(), Error> {
34 let db = Db::memory().await?;
35 db.execute(
36 "CREATE TABLE users (
37 id INTEGER PRIMARY KEY AUTOINCREMENT,
38 name TEXT NOT NULL,
39 is_admin INTEGER NOT NULL
40 )",
41 )
42 .await?;
43
44 let alice_id = User {
45 id: 0,
46 name: "Alice".into(),
47 is_admin: false,
48 }
49 .create(&db)
50 .await?;
51 let bob_id = User {
52 id: 0,
53 name: "Bob".into(),
54 is_admin: true,
55 }
56 .create(&db)
57 .await?;
58 println!("created ids: alice={alice_id} bob={bob_id}");
59
60 let alice = User::find(&db, alice_id).await?.expect("alice");
61 println!("find alice: {alice:?}");
62
63 let all = User::all(&db).await?;
64 println!("all: {all:?}");
65
66 let renamed = User {
67 id: alice_id,
68 name: "Alicia".into(),
69 is_admin: false,
70 };
71 renamed.update(&db).await?;
72 let after_update = User::find(&db, alice_id).await?.unwrap();
73 println!("after update: {after_update:?}");
74
75 User::delete(&db, bob_id).await?;
76 println!("remaining after delete bob: {:?}", User::all(&db).await?);
77
78 Ok(())
79}Sourcefn update<'a>(
&'a self,
db: &'a Db,
) -> impl Future<Output = Result<(), Error>> + Send + 'a
fn update<'a>( &'a self, db: &'a Db, ) -> impl Future<Output = Result<(), Error>> + Send + 'a
Examples found in repository?
examples/orm_demo.rs (line 71)
33async fn main() -> Result<(), Error> {
34 let db = Db::memory().await?;
35 db.execute(
36 "CREATE TABLE users (
37 id INTEGER PRIMARY KEY AUTOINCREMENT,
38 name TEXT NOT NULL,
39 is_admin INTEGER NOT NULL
40 )",
41 )
42 .await?;
43
44 let alice_id = User {
45 id: 0,
46 name: "Alice".into(),
47 is_admin: false,
48 }
49 .create(&db)
50 .await?;
51 let bob_id = User {
52 id: 0,
53 name: "Bob".into(),
54 is_admin: true,
55 }
56 .create(&db)
57 .await?;
58 println!("created ids: alice={alice_id} bob={bob_id}");
59
60 let alice = User::find(&db, alice_id).await?.expect("alice");
61 println!("find alice: {alice:?}");
62
63 let all = User::all(&db).await?;
64 println!("all: {all:?}");
65
66 let renamed = User {
67 id: alice_id,
68 name: "Alicia".into(),
69 is_admin: false,
70 };
71 renamed.update(&db).await?;
72 let after_update = User::find(&db, alice_id).await?.unwrap();
73 println!("after update: {after_update:?}");
74
75 User::delete(&db, bob_id).await?;
76 println!("remaining after delete bob: {:?}", User::all(&db).await?);
77
78 Ok(())
79}Sourcefn delete(db: &Db, id: i64) -> impl Future<Output = Result<(), Error>> + Send
fn delete(db: &Db, id: i64) -> impl Future<Output = Result<(), Error>> + Send
Examples found in repository?
examples/orm_demo.rs (line 75)
33async fn main() -> Result<(), Error> {
34 let db = Db::memory().await?;
35 db.execute(
36 "CREATE TABLE users (
37 id INTEGER PRIMARY KEY AUTOINCREMENT,
38 name TEXT NOT NULL,
39 is_admin INTEGER NOT NULL
40 )",
41 )
42 .await?;
43
44 let alice_id = User {
45 id: 0,
46 name: "Alice".into(),
47 is_admin: false,
48 }
49 .create(&db)
50 .await?;
51 let bob_id = User {
52 id: 0,
53 name: "Bob".into(),
54 is_admin: true,
55 }
56 .create(&db)
57 .await?;
58 println!("created ids: alice={alice_id} bob={bob_id}");
59
60 let alice = User::find(&db, alice_id).await?.expect("alice");
61 println!("find alice: {alice:?}");
62
63 let all = User::all(&db).await?;
64 println!("all: {all:?}");
65
66 let renamed = User {
67 id: alice_id,
68 name: "Alicia".into(),
69 is_admin: false,
70 };
71 renamed.update(&db).await?;
72 let after_update = User::find(&db, alice_id).await?.unwrap();
73 println!("after update: {after_update:?}");
74
75 User::delete(&db, bob_id).await?;
76 println!("remaining after delete bob: {:?}", User::all(&db).await?);
77
78 Ok(())
79}Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.