1use crate::query::Expr;
2use crate::schema::constraint::Constraint;
3use crate::util::SqlExtension;
4use crate::{Dialect, Generated, ToSql, Type};
5
6#[derive(Debug, Clone, PartialEq, Eq)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub struct Column {
9 pub name: String,
10 pub typ: Type,
11 pub nullable: bool,
12 pub primary_key: bool,
13 #[cfg_attr(
14 feature = "serde",
15 serde(default, skip_serializing_if = "Option::is_none")
16 )]
17 pub default: Option<Expr>,
18 #[cfg_attr(
19 feature = "serde",
20 serde(default, skip_serializing_if = "Option::is_none")
21 )]
22 pub constraint: Option<Constraint>,
23 #[cfg_attr(
24 feature = "serde",
25 serde(default, skip_serializing_if = "Option::is_none")
26 )]
27 pub generated: Option<Generated>,
28}
29
30impl ToSql for Column {
31 fn write_sql(&self, buf: &mut String, dialect: Dialect) {
32 buf.push_quoted(&self.name);
33 buf.push(' ');
34 buf.push_str(&self.typ.to_sql(dialect));
35 if let Some(generated) = &self.generated {
36 buf.push(' ');
37 buf.push_sql(generated, dialect);
38 }
39 if !self.nullable {
40 buf.push_str(" NOT NULL");
41 }
42 if self.primary_key {
43 buf.push_str(" PRIMARY KEY");
44 }
45 if let Some(default) = &self.default {
46 buf.push_str(" DEFAULT ");
47 buf.push_sql(default, dialect);
48 }
49 if let Some(constraint) = &self.constraint {
50 buf.push(' ');
51 buf.push_sql(constraint, dialect);
52 }
53 }
54}