example_actix/
example_actix.rs1use actix_web::web::{Data, Html};
2use actix_web::{App, HttpServer, web};
3
4use askama::Template;
5use sqlx::AnyPool;
6
7use sqlx::any::install_default_drivers;
8use sqlx_askama_template::SqlTemplate;
9
10#[derive(sqlx::prelude::FromRow, PartialEq, Eq, Debug, serde::Serialize)]
11struct User {
12 id: i64,
13 name: String,
14}
15#[derive(SqlTemplate)]
16#[template(source = r#"
17 select {{e(user_id)}} as id,{{e(user_name)}} as name
18 union all
19 {%- let id=99999_i64 %}
20 {%- let name="super man" %}
21 select {{et(id)}} as id,{{et(name)}} as name
22"#)]
23pub struct UserQuery<'a> {
24 pub user_id: i64,
25 pub user_name: &'a str,
26}
27#[derive(askama::Template)]
28#[template(
29 ext = "html",
30 source = r#"
31 <html>
32 <head>
33 <title>SQLx Askama Template</title>
34 </head>
35 <body>
36 <h1>SQLx Askama Template</h1>
37 <p>Welcome to the SQLx Askama Template!</p>
38 <h1>query database with askama template</h1>
39 <table border="1">
40 <tr>
41 <th>id</th>
42 <th>name</th>
43 </tr>
44 {% for user in users %}
45 <tr>
46 <td>{{ user.id }}</td>
47 <td>{{ user.name }}</td>
48 </tr>
49 {% endfor %}
50 </body>
51</html>"#
52)]
53struct IndexHtml {
54 users: Vec<User>,
55}
56async fn root(pool: Data<AnyPool>) -> impl actix_web::Responder {
57 let user_query = UserQuery {
59 user_id: 1,
60 user_name: "actix",
61 };
62 let count = user_query.adapter_render().count(&**pool).await.unwrap();
63 println!("count: {count}");
64
65 let mut conn = pool.acquire().await.unwrap();
66 let users: Vec<User> = user_query
67 .adapter_render()
68 .fetch_all_as(&mut *conn)
69 .await
70 .unwrap();
71
72 Html::new(IndexHtml { users }.render().unwrap())
73}
74#[actix_web::main] async fn main() -> std::io::Result<()> {
76 install_default_drivers();
77 let pool = AnyPool::connect("sqlite://db.file?mode=memory")
78 .await
79 .unwrap();
80
81 HttpServer::new(move || {
82 App::new()
83 .app_data(Data::new(pool.clone()))
84 .route("/", web::get().to(root))
85 })
86 .bind("0.0.0.0:3000")?
87 .run()
88 .await
89}