sea_schema/mysql/query/
column.rs1use super::{InformationSchema, SchemaQueryBuilder};
2use crate::sqlx_types::mysql::MySqlRow;
3use sea_query::{Expr, Iden, Order, Query, SeaRc, SelectStatement, Value};
4
5#[derive(Debug, sea_query::Iden)]
6pub enum ColumnFields {
8 TableCatalog,
9 TableSchema,
10 TableName,
11 ColumnName,
12 OrdinalPosition,
13 ColumnDefault,
14 IsNullable,
15 DataType,
16 CharacterMaximumLength,
17 CharacterOctetLength,
18 NumericPrecision,
19 NumericScale,
20 DatetimePrecision,
21 CharacterSetName,
22 CollationName,
23 ColumnType,
24 ColumnKey,
25 Extra,
26 Privileges,
27 ColumnComment,
28 GenerationExpression,
29 SrsId,
30}
31
32#[derive(Debug, Default)]
33pub struct ColumnQueryResult {
34 pub column_name: String,
35 pub column_type: String,
36 pub is_nullable: String,
37 pub column_key: String,
38 pub column_default: Option<String>,
39 pub extra: String,
40 pub generation_expression: Option<String>,
41 pub column_comment: String,
42}
43
44impl SchemaQueryBuilder {
45 pub fn query_columns(
46 &self,
47 schema: SeaRc<dyn Iden>,
48 table: SeaRc<dyn Iden>,
49 ) -> SelectStatement {
50 Query::select()
51 .columns([
52 ColumnFields::ColumnName,
53 ColumnFields::ColumnType,
54 ColumnFields::IsNullable,
55 ColumnFields::ColumnKey,
56 ColumnFields::ColumnDefault,
57 ColumnFields::Extra,
58 ])
59 .conditions(
60 self.system.is_mysql() && self.system.version >= 50700,
61 |q| {
62 q.column(ColumnFields::GenerationExpression);
63 },
64 |q| {
65 q.expr(Expr::val(Value::String(None)));
66 },
67 )
68 .column(ColumnFields::ColumnComment)
69 .from((InformationSchema::Schema, InformationSchema::Columns))
70 .and_where(Expr::col(ColumnFields::TableSchema).eq(schema.to_string()))
71 .and_where(Expr::col(ColumnFields::TableName).eq(table.to_string()))
72 .order_by(ColumnFields::OrdinalPosition, Order::Asc)
73 .take()
74 }
75}
76
77#[cfg(feature = "sqlx-mysql")]
78impl From<&MySqlRow> for ColumnQueryResult {
79 fn from(row: &MySqlRow) -> Self {
80 use crate::mysql::discovery::GetMySqlValue;
81 Self {
82 column_name: row.get_string(0),
83 column_type: row.get_string(1),
84 is_nullable: row.get_string(2),
85 column_key: row.get_string(3),
86 column_default: row.get_string_opt(4),
87 extra: row.get_string(5),
88 generation_expression: row.get_string_opt(6),
89 column_comment: row.get_string(7),
90 }
91 }
92}
93
94#[cfg(not(feature = "sqlx-mysql"))]
95impl From<&MySqlRow> for ColumnQueryResult {
96 fn from(_: &MySqlRow) -> Self {
97 Self::default()
98 }
99}