echoes/backend/src/sql/postgresql.rs

52 lines
1.3 KiB
Rust
Raw Normal View History

use async_trait::async_trait;
2024-11-11 01:38:58 +08:00
use sqlx::{PgPool, Row,Column};
use std::{collections::HashMap, error::Error};
use super::Databasetrait;
2024-11-11 01:38:58 +08:00
#[derive(Clone)]
pub struct Postgresql {
2024-11-11 01:38:58 +08:00
pool: PgPool,
}
#[async_trait]
2024-11-11 01:38:58 +08:00
impl Databasetrait for Postgresql {
async fn connect(
address: String,
port: u32,
user: String,
password: String,
dbname: String,
) -> Result<Self, Box<dyn Error>> {
let connection_str = format!(
"postgres://{}:{}@{}:{}/{}",
user, password, address, port, dbname
);
let pool = PgPool::connect(&connection_str)
.await
.map_err(|e| Box::new(e) as Box<dyn Error>)?;
Ok(Postgresql { pool })
}
2024-11-11 01:38:58 +08:00
async fn query<'a>(&'a self, query: String) -> Result<Vec<HashMap<String, String>>, Box<dyn Error + 'a>> {
let rows = sqlx::query(&query)
.fetch_all(&self.pool)
.await
.map_err(|e| Box::new(e) as Box<dyn Error>)?;
let mut results = Vec::new();
for row in rows {
let mut map = HashMap::new();
for column in row.columns() {
let value: String = row.try_get(column.name()).unwrap_or_default();
map.insert(column.name().to_string(), value);
}
results.push(map);
}
2024-11-11 01:38:58 +08:00
Ok(results)
}
2024-11-11 01:38:58 +08:00
}