use crate::database::migrations::CustomMigrationError;
use crate::database::DatabaseConnection;
use sqlx::Row as _;
const PRIMARY_KEY_SQL: &str = "SELECT a.attname \
FROM pg_index i \
JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey) \
WHERE i.indrelid = $1::regclass AND i.indisprimary \
ORDER BY array_position(i.indkey, a.attnum)";
pub(super) async fn primary_key(
connection: &DatabaseConnection,
table: &str,
) -> Result<Vec<String>, CustomMigrationError> {
let DatabaseConnection::Pg(pool) = connection else {
return Ok(Vec::new());
};
let rows = sqlx::query(PRIMARY_KEY_SQL)
.bind(table)
.fetch_all(pool.as_ref())
.await
.map_err(CustomMigrationError::SqlxError)?;
Ok(rows
.iter()
.filter_map(|row| row.try_get::<String, _>("attname").ok())
.collect())
}