sea_schema/postgres/query/
table.rs

1use super::{select_base_table_and_view, InformationSchema, SchemaQueryBuilder};
2use crate::sqlx_types::postgres::PgRow;
3use sea_query::{Expr, Iden, Query, SeaRc, SelectStatement};
4
5#[derive(Debug, sea_query::Iden)]
6/// Ref: https://www.postgresql.org/docs/13/infoschema-tables.html
7pub enum TablesFields {
8    TableCatalog,
9    TableSchema,
10    TableName,
11    TableType,
12    UserDefinedTypeSchema,
13    UserDefinedTypeName,
14    // IsInsertableInto is always true for BASE TABLEs
15    IsInsertableInto,
16    IsTyped,
17}
18
19#[derive(Debug, sea_query::Iden)]
20pub enum TableType {
21    #[iden = "BASE TABLE"]
22    BaseTable,
23    #[iden = "VIEW"]
24    View,
25    #[iden = "FOREIGN"]
26    Foreign,
27    #[iden = "LOCAL TEMPORARY"]
28    Temporary,
29}
30
31#[derive(Debug, Default)]
32pub struct TableQueryResult {
33    pub table_name: String,
34    pub user_defined_type_schema: Option<String>,
35    pub user_defined_type_name: Option<String>,
36}
37
38impl SchemaQueryBuilder {
39    pub fn query_tables(&self, schema: SeaRc<dyn Iden>) -> SelectStatement {
40        Query::select()
41            .columns(vec![
42                TablesFields::TableName,
43                TablesFields::UserDefinedTypeSchema,
44                TablesFields::UserDefinedTypeName,
45            ])
46            .from((InformationSchema::Schema, InformationSchema::Tables))
47            .and_where(Expr::col(TablesFields::TableSchema).eq(schema.to_string()))
48            .and_where(Expr::col(TablesFields::TableType).eq(TableType::BaseTable.to_string()))
49            .and_where(
50                Expr::col(TablesFields::TableName).not_in_subquery(select_base_table_and_view()),
51            )
52            .take()
53    }
54}
55
56#[cfg(feature = "sqlx-postgres")]
57impl From<&PgRow> for TableQueryResult {
58    fn from(row: &PgRow) -> Self {
59        use crate::sqlx_types::Row;
60        Self {
61            table_name: row.get(0),
62            user_defined_type_schema: row.get(1),
63            user_defined_type_name: row.get(2),
64        }
65    }
66}
67
68#[cfg(not(feature = "sqlx-postgres"))]
69impl From<&PgRow> for TableQueryResult {
70    fn from(_: &PgRow) -> Self {
71        Self::default()
72    }
73}