Skip to main content

example_actix/
example_actix.rs

1use 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    //  test count
58    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] // or #[tokio::main]
75async 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}