pub struct Db { /* private fields */ }Implementations§
Source§impl Db
impl Db
Sourcepub async fn connect(url: &str) -> Result<Self, Error>
pub async fn connect(url: &str) -> Result<Self, Error>
Open a pool against the given SQLite URL.
Foreign-key enforcement is always on (PRAGMA foreign_keys = ON
applied on every connection via sqlx’s connect-time hook). SQLite
ignores FK constraints unless this pragma is set per-connection,
and relying on user configuration to enable it is unsafe —
ON DELETE CASCADE in the schema would silently do nothing.
Sourcepub async fn memory() -> Result<Self, Error>
pub async fn memory() -> Result<Self, Error>
Open an in-memory pool with FK enforcement on.
Limited to a single connection because each :memory: connection
opens its own database; multiple would not share rows.
Examples found in repository?
examples/admin_demo.rs (line 23)
22async fn main() -> std::io::Result<()> {
23 let db = Db::memory().await.expect("db connect");
24 auth::ensure_core_tables(&db)
25 .await
26 .expect("create auth tables");
27
28 auth::user::create(&db, "admin@example.com", "admin", "admin")
29 .await
30 .expect("seed admin user");
31
32 seed_demo_data(&db).await;
33
34 let router = with_defaults(Router::new()).wrap(authenticate(db.clone()));
35 // No `.model::<T>()` calls: the new engine uses its own
36 // `AdminUiModel` registry (Users + Orders are wired in by
37 // `Admin::register`). The legacy AdminModel + macro path is
38 // intentionally not exercised here so there is exactly one
39 // admin surface in the demo.
40 let router = Admin::new().register(router, &db);
41
42 let addr: SocketAddr = ([127, 0, 0, 1], 3000).into();
43 eprintln!("admin demo: open http://{addr}/admin and sign in as admin@example.com / admin");
44 Server::bind(addr).serve_router(router).await
45}More examples
examples/orm_demo.rs (line 34)
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}examples/homepage.rs (line 52)
50async fn main() -> std::io::Result<()> {
51 let addr: SocketAddr = ([127, 0, 0, 1], 3000).into();
52 let db = Db::memory().await.expect("db connect");
53 auth::ensure_core_tables(&db)
54 .await
55 .expect("create auth tables");
56 auth::user::create(&db, "admin@example.com", "admin", "admin")
57 .await
58 .expect("seed admin user");
59
60 let router = with_defaults(Router::new())
61 .get("/whoami", |req, _params| async move {
62 let id = req
63 .ctx()
64 .get::<RequestId>()
65 .map(|r| r.0.to_string())
66 .unwrap_or_else(|| "unknown".into());
67 Ok::<Response, Error>(text(format!("your request id is req-{id}\n")))
68 })
69 .get("/me", |req, _params| async move {
70 let id = require_auth(req.ctx())?;
71 Ok::<Response, Error>(text(format!("hello {}\n", id.email)))
72 })
73 .get("/admin-only", |req, _params| async move {
74 let id = require_admin(req.ctx())?;
75 Ok::<Response, Error>(text(format!("hello admin {}\n", id.email)))
76 })
77 .get("/crash", |_req, _params| async {
78 Err::<Response, Error>(Error::Internal("simulated failure".into()))
79 })
80 .get("/unauth", |_req, _params| async {
81 Err::<Response, Error>(Error::Unauthorized)
82 })
83 .wrap(request_id)
84 .wrap(authenticate(db))
85 .wrap(logger);
86 Server::bind(addr).serve_router(router).await
87}Sourcepub async fn execute(&self, sql: &str) -> Result<(), Error>
pub async fn execute(&self, sql: &str) -> Result<(), Error>
Examples found in repository?
examples/orm_demo.rs (lines 35-41)
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}More examples
examples/admin_demo.rs (lines 58-67)
57async fn seed_demo_data(db: &Db) {
58 db.execute(
59 "CREATE TABLE IF NOT EXISTS admin_new_demo_users (
60 id INTEGER PRIMARY KEY AUTOINCREMENT,
61 username TEXT NOT NULL,
62 email TEXT NOT NULL,
63 is_active TEXT NOT NULL DEFAULT 'false',
64 doctor_id TEXT,
65 salary_amount TEXT
66 )",
67 )
68 .await
69 .expect("create users table");
70
71 db.execute(
72 "CREATE TABLE IF NOT EXISTS admin_new_demo_orders (
73 id INTEGER PRIMARY KEY AUTOINCREMENT,
74 order_number TEXT,
75 customer_email TEXT,
76 total_amount TEXT,
77 is_paid TEXT
78 )",
79 )
80 .await
81 .expect("create orders table");
82
83 let user_inserts = "INSERT INTO admin_new_demo_users \
84 (username, email, is_active, doctor_id, salary_amount) VALUES \
85 ('amansour', 'abdulwahed@rustio.dev', 'true', '1', '5400'), \
86 ('b.hassan', 'bashayer@rustio.dev', 'true', '1', '4800'), \
87 ('sara_m', 'sara@rustio.dev', 'true', '2', '3600'), \
88 ('l.nguyen', 'linh@example.com', 'true', '1', '5100'), \
89 ('k.ito', 'kenji@example.com', 'true', '2', '3200'), \
90 ('m.osei', 'maya@example.com', 'true', '2', '3000'), \
91 ('r.silva', 'rafael@example.com', 'false', '1', '2800'), \
92 ('p.kapoor', 'priya@example.com', 'true', '2', '4200'), \
93 ('n.eriksson','nils@example.com', 'true', '1', '3900'), \
94 ('z.ahmed', 'zainab@example.com', 'false', '2', '2100')";
95 let _ = db.execute(user_inserts).await;
96
97 let order_inserts = "INSERT INTO admin_new_demo_orders \
98 (order_number, customer_email, total_amount, is_paid) VALUES \
99 ('RIO-1001', 'abdulwahed@rustio.dev', '129.00', 'true'), \
100 ('RIO-1002', 'bashayer@rustio.dev', '89.50', 'true'), \
101 ('RIO-1003', 'sara@rustio.dev', '245.00', 'false'), \
102 ('RIO-1004', 'linh@example.com', '320.00', 'true'), \
103 ('RIO-1005', 'kenji@example.com', '57.25', 'false'), \
104 ('RIO-1006', 'maya@example.com', '412.10', 'true'), \
105 ('RIO-1007', 'rafael@example.com', '76.40', 'false'), \
106 ('RIO-1008', 'priya@example.com', '199.99', 'true'), \
107 ('RIO-1009', 'nils@example.com', '88.00', 'true'), \
108 ('RIO-1010', 'zainab@example.com', '33.00', 'false')";
109 let _ = db.execute(order_inserts).await;
110}Trait Implementations§
Auto Trait Implementations§
impl Freeze for Db
impl !RefUnwindSafe for Db
impl Send for Db
impl Sync for Db
impl Unpin for Db
impl UnsafeUnpin for Db
impl !UnwindSafe for Db
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more