Skip to content

Instantly share code, notes, and snippets.

@hendi
Last active September 7, 2024 20:02
Show Gist options
  • Save hendi/3ff7f988a51125d757095d5fd2a8c216 to your computer and use it in GitHub Desktop.
Save hendi/3ff7f988a51125d757095d5fd2a8c216 to your computer and use it in GitHub Desktop.
Rust: rocket with sqlx
#[macro_use] extern crate rocket;
use std::env;
use anyhow::Result;
use rocket::State;
use rocket::http::Status;
use sqlx::{Pool, Postgres};
use sqlx::postgres::PgPoolOptions;
#[derive(Debug)]
pub struct User {
pub id: i32,
pub name: String,
}
impl User {
pub async fn find_by_id(id: i32, pool: &Pool<Postgres>) -> Result<User> {
let user = sqlx::query_as!(User, "SELECT * FROM my_table WHERE id = $1", id)
.fetch_one(&*pool)
.await?;
Ok(user)
}
}
#[get("/<id>")]
async fn hello(pool: State<'_, Pool<Postgres>>, id: i32) -> Result<String, Status> {
let user = User::find_by_id(id, &pool).await;
match user {
Ok(user) => Ok(format!("Hello {}!", &user.name)),
_ => Err(Status::NotFound)
}
}
#[rocket::main]
async fn main() -> Result<()> {
let database_url = env::var("DATABASE_URL")?;
let pool = PgPoolOptions::new()
.max_connections(5)
.connect(&database_url)
.await?;
rocket::ignite()
.mount("/", routes![hello])
.manage(pool)
.launch()
.await?;
Ok(())
}
@aburd
Copy link

aburd commented Feb 5, 2022

Many thanks for this gist 🙇

@3nt3
Copy link

3nt3 commented May 27, 2022

What version of rocket does this use?

@3nt3
Copy link

3nt3 commented May 27, 2022

Line 30 doesn't compile unless I change it to &State<Pool<Postgres>>

@opeolluwa
Copy link

opeolluwa commented Jul 8, 2022

Hi there 😊
This just saved my day. Where do I add create table if not exists.

@reidaruss
Copy link

Line 30 doesn't compile unless I change it to &State<Pool<Postgres>>

Been trying to figure out what to change this to for a while, this worked thanks!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment