sea_schema/postgres/query/
table.rs1use 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)]
6pub enum TablesFields {
8 TableCatalog,
9 TableSchema,
10 TableName,
11 TableType,
12 UserDefinedTypeSchema,
13 UserDefinedTypeName,
14 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}