tea_orm/queries/
list_databases.rs1use anyhow::Context;
2use anyhow::Result;
3use sea_orm::query::ConnectionTrait;
4use sea_orm::query::Statement;
5use sea_orm::DatabaseConnection;
6use sea_orm::DbBackend;
7
8pub async fn query_list_databases(db_connection: &DatabaseConnection) -> Result<Vec<String>> {
9 let db_backend = db_connection.get_database_backend();
10 let list_databases_statement = create_list_databases_statement(db_backend);
11
12 let results = db_connection
13 .query_all(list_databases_statement)
14 .await
15 .with_context(|| format!("Trying to list all databases"))?;
16
17 let database_names: Vec<String> = results
18 .into_iter()
19 .map(|row_result| {
20 let database_name = row_result
21 .try_get::<String>("", "database_name")
22 .expect("expect `database_name` to be present in SQL Query results");
23
24 database_name
25 })
26 .collect();
27
28 Ok(database_names)
29}
30
31fn create_list_databases_statement(db_backend: DbBackend) -> Statement {
32 match db_backend {
33 DbBackend::Postgres => Statement::from_string(
34 db_backend,
35 "SELECT datname AS database_name FROM pg_database
36 WHERE datistemplate = false"
37 .to_string(),
38 ),
39 _ => {
40 unimplemented!("Unsupported db backend used")
41 }
42 }
43}
44
45#[cfg(test)]
46mod query_list_databases {
47 use crate::new_database_connection;
48 use crate::queries::query_create_random_database;
49 use crate::queries::query_list_databases;
50
51 const POSTGRES_LOCAL_DB_URL: &'static str = &"postgres://user:password@localhost:5432/tea-orm";
52
53 #[tokio::test]
54 async fn is_should_list_the_current_number_of_dbs_after_creation() {
55 let db_connection = new_database_connection(POSTGRES_LOCAL_DB_URL.to_string())
56 .await
57 .unwrap();
58 let dbs = query_list_databases(&db_connection).await.unwrap();
59 let new_database_name = query_create_random_database(&db_connection).await.unwrap();
60 let new_dbs = query_list_databases(&db_connection).await.unwrap();
61
62 assert_eq!(dbs.contains(&new_database_name), false);
68 assert!(dbs.len() < new_dbs.len());
69 assert_eq!(new_dbs.contains(&new_database_name), true);
70 }
71}