tea_orm/queries/
create_database.rs1use 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
12pub 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}