use sqlx::{ migrate::MigrateDatabase, postgres::PgPoolOptions, Connection, PgConnection, PgPool, Postgres, }; pub async fn connect() -> Result { tracing::info!("Initializing database connection"); let database_url = dotenvy::var("DATABASE_URL").expect("`DATABASE_URL` environment variable not set"); let pool = PgPoolOptions::new() .max_connections(5) .connect(&database_url) .await?; Ok(pool) } pub async fn apply_migrations() -> Result<(), sqlx::Error> { let uri = dotenvy::var("DATABASE_URL").expect("`DATABASE_URL` environment variable not set"); let uri = uri.as_str(); if !Postgres::database_exists(uri).await? { tracing::info!("Creating database..."); Postgres::create_database(uri).await?; } tracing::info!("Applying migrations..."); let mut conn = PgConnection::connect(uri).await?; sqlx::migrate!() .run(&mut conn) .await .expect("Error while running database migrations"); Ok(()) }