tea_orm/queries/
create_database.rs

1use anyhow::anyhow;
2use anyhow::Context;
3use anyhow::Result;
4use sea_orm::query::ConnectionTrait;
5use sea_orm::query::Statement;
6use sea_orm::DatabaseConnection;
7use sea_orm::DbBackend;
8use std::fmt::Display;
9
10use crate::queries::is_alphanumeric_underscore_hyphen;
11
12/// Runs a query which will create a new database with the given name.
13pub async fn query_create_database<S>(db_connection: &DatabaseConnection, name: &S) -> Result<()>
14where
15    S: Display,
16{
17    let db_backend = db_connection.get_database_backend();
18    let db_name = name.to_string();
19    let create_db_statement = create_database_statement(db_backend, &db_name)?;
20
21    db_connection
22        .execute(create_db_statement)
23        .await
24        .with_context(|| format!("Trying to create new database with name '{}'", db_name))?;
25
26    Ok(())
27}
28
29fn create_database_statement(db_backend: DbBackend, db_name: &str) -> Result<Statement> {
30    if !is_alphanumeric_underscore_hyphen(db_name) {
31        return Err(anyhow!(
32            "Given database name is empty or contains non-alphanumeric characters '{}'",
33            db_name
34        ));
35    }
36
37    let statement = match db_backend {
38        DbBackend::Postgres => {
39            let raw_sql = format!(r#"CREATE DATABASE "{}""#, db_name);
40            let statement = Statement::from_string(db_backend, raw_sql);
41
42            statement
43        }
44        _ => {
45            unimplemented!("Unsupported db backend used")
46        }
47    };
48
49    Ok(statement)
50}