Skip to content
This repository has been archived by the owner on Apr 3, 2024. It is now read-only.

[UPSTREAMED TO SHUTTLE ITSELF] diesel-async resource for Shuttle services

License

Notifications You must be signed in to change notification settings

aumetra/shuttle-diesel-async

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

shuttle-diesel-async

diesel-async resource for Shuttle services

License

shuttle-diesel-async is licensed under the MIT license.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, shall be licensed as above, without any additional terms or conditions.

Usage

Add the crate, with deadpool or bb8. If you haven't already, also add your shuttle dependencies.

This example demonstrates usage with postgres and deadpool.

cargo add --git "https://github.com/aumetra/shuttle-diesel-async" -F "deadpool"
# or
cargo add --git "https://github.com/aumetra/shuttle-diesel-async" -F "bb8"

## diesel dependencies
cargo add diesel -F postgres
cargo add diesel-async -F postgres -F deadpool

## other shuttle dependencies you may want
cargo add shuttle-runtime  # or cargo add shuttle-runtime --no-default-features
# to load secrets, like the DATABASE_URL from your environment
cargo add shuttle-secrets

# the following example demonstrates with shuttle-axum
cargo add axum 
cargo add shuttle-axum

Adjust your main function, (We will use ShuttleAxum as example) to set up your database connection, and add fields in your Secrets.toml accordingly.

Secrets.toml:

DB_PASSWORD="postgres" # or whatever you have it set to
DB_PORT="5432" # default port for postgres
use diesel::result::Error;
use diesel_async::{
  pooled_connection::{deadpool::Pool, AsyncDieselConnectionManager},
  AsyncConnection, RunQueryDsl,
};

#[derive(Clone)]
pub struct SharedState {
  pub pool: Pool<AsyncPgConnection>,
}

#[shuttle_runtime::main]
async fn main(
  #[shuttle_secrets::Secrets] secret_store: shuttle_secrets::SecretStore,
  // shuttle will provision the database connection
  #[shuttle_shared_db::Postgres(
    local_uri = "postgres://postgres:{secrets.DB_PASSWORD}@localhost:{secrets.DB_PORT}/postgres"
  )]
  conn_str: String,
) -> shuttle_axum::ShuttleAxum {

  let config = AsyncDieselConnectionManager::<diesel_async::AsyncPgConnection>::new(conn_str);
  let pool = Pool::builder(config).build().unwrap();
  let shared_state = SharedState { pool };

  let router = Router::new()
    .route("/", get(handler))
    .with_state(shared_state);

  Ok(router.into())
}

use axum::extract::State;
async fn handler(State(state): State<SharedState>) {
  // get the connection from the pool
  let mut conn = state.pool.get().await.unwrap();
  // and you're good to go.
  crate::schema::your_table_name::dsl::your_table_name.select(YourTableStruct::as_select()).load(conn).await.unwrap()
}

Refer to this example for further direction on using diesel, and the shuttle docs on shuttle-shared-db.

About

[UPSTREAMED TO SHUTTLE ITSELF] diesel-async resource for Shuttle services

Resources

License

Stars

Watchers

Forks

Languages