Skip to main content

example_ntex/
example_ntex.rs

1use askama::Template;
2use ntex::http::Response;
3use ntex::web::types::State;
4use ntex::web::{self, Responder};
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: State<AnyPool>) -> impl Responder {
57    //  test count
58    let user_query = UserQuery {
59        user_id: 1,
60        user_name: "ntex",
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    Response::Ok().body(IndexHtml { users }.render().unwrap())
73}
74#[ntex::main]
75async fn main() -> std::io::Result<()> {
76    install_default_drivers();
77
78    let pool = AnyPool::connect("sqlite://db.file?mode=memory")
79        .await
80        .unwrap();
81    web::HttpServer::new(async move || {
82        web::App::new()
83            .state(pool.clone())
84            .route("/", web::get().to(root))
85    })
86    .bind(("0.0.0.0", 3000))?
87    .run()
88    .await
89}