Skip to main content

drizzle_types/postgres/ddl/
mod.rs

1//! `PostgreSQL` DDL (Data Definition Language) entity types
2//!
3//! This module provides two complementary types for each DDL entity:
4//!
5//! - **`*Def` types** - Const-friendly definitions using only `Copy` types (`&'static str`, `bool`)
6//!   for compile-time schema definitions
7//! - **Runtime types** - Full types with `Cow<'static, str>` for serde serialization/deserialization
8//!
9//! # Design Pattern
10//!
11//! ```rust
12//! # let _ = r####"
13//! ┌─────────────────────────────────────────────────────────────────────────┐
14//! │  Compile Time (const)           Runtime (serde)                         │
15//! │  ─────────────────────           ────────────────                        │
16//! │                                                                          │
17//! │  const DEF: TableDef = ...;     let table: Table = DEF.into_table();     │
18//! │  const COLS: &[ColumnDef] = ... let cols: Vec<Column> = ...              │
19//! │                                                                          │
20//! │  Uses: &'static str, bool       Uses: Cow<'static, str>, Vec, Option     │
21//! │  All types are Copy             Supports serde, owned strings            │
22//! └─────────────────────────────────────────────────────────────────────────┘
23//! # "####;
24//! ```
25//!
26//! # PostgreSQL-Specific Features
27//!
28//! `PostgreSQL` DDL types include additional features not present in `SQLite`:
29//!
30//! - **Schemas** - Namespace support (`public`, `custom_schema`, etc.)
31//! - **Enums** - User-defined enumerated types
32//! - **Sequences** - Auto-increment sequences (alternative to SERIAL)
33//! - **Roles** - Database roles/permissions
34//! - **Policies** - Row-level security policies
35//! - **Identity Columns** - GENERATED ALWAYS/BY DEFAULT AS IDENTITY
36//! - **Generated Columns** - GENERATED AS expression STORED
37//! - **Index Options** - Operator classes, nulls ordering, etc.
38
39mod check_constraint;
40mod column;
41mod enum_type;
42mod foreign_key;
43mod index;
44mod policy;
45mod primary_key;
46mod privilege;
47mod role;
48mod schema;
49mod sequence;
50pub mod sql;
51mod unique_constraint;
52mod view;
53
54// Const-friendly definition types
55pub use check_constraint::CheckConstraintDef;
56pub use column::{ColumnDef, GeneratedDef, GeneratedType, IdentityDef, IdentityType};
57pub use enum_type::EnumDef;
58pub use foreign_key::{ForeignKeyDef, ReferentialAction};
59pub use index::{IndexColumn, IndexColumnDef, IndexDef, OpclassDef};
60pub use policy::PolicyDef;
61pub use primary_key::PrimaryKeyDef;
62pub use privilege::{PrivilegeDef, PrivilegeType};
63pub use role::RoleDef;
64pub use schema::SchemaDef;
65pub use sequence::SequenceDef;
66pub use unique_constraint::UniqueConstraintDef;
67pub use view::{ViewDef, ViewWithOptionDef};
68
69// Runtime types for serde
70pub use check_constraint::CheckConstraint;
71pub use column::{Column, Generated, Identity};
72pub use enum_type::Enum;
73pub use foreign_key::ForeignKey;
74pub use index::{Index, Opclass};
75pub use policy::Policy;
76pub use primary_key::PrimaryKey;
77pub use privilege::Privilege;
78pub use role::Role;
79pub use schema::Schema;
80pub use sequence::Sequence;
81pub use unique_constraint::UniqueConstraint;
82pub use view::{View, ViewWithOption};
83
84// SQL generation
85pub use sql::TableSql;
86
87#[cfg(feature = "serde")]
88pub use crate::serde_helpers::{
89    cow_from_string, cow_option_from_string, cow_option_vec_from_strings, cow_vec_from_strings,
90};
91
92// =============================================================================
93// Entity Type Constants (for compatibility with migrations)
94// =============================================================================
95
96/// Entity type discriminator for schemas
97pub const ENTITY_TYPE_SCHEMAS: &str = "schemas";
98/// Entity type discriminator for enums
99pub const ENTITY_TYPE_ENUMS: &str = "enums";
100/// Entity type discriminator for sequences
101pub const ENTITY_TYPE_SEQUENCES: &str = "sequences";
102/// Entity type discriminator for roles
103pub const ENTITY_TYPE_ROLES: &str = "roles";
104/// Entity type discriminator for policies
105pub const ENTITY_TYPE_POLICIES: &str = "policies";
106/// Entity type discriminator for tables
107pub const ENTITY_TYPE_TABLES: &str = "tables";
108/// Entity type discriminator for columns
109pub const ENTITY_TYPE_COLUMNS: &str = "columns";
110/// Entity type discriminator for indexes
111pub const ENTITY_TYPE_INDEXES: &str = "indexes";
112/// Entity type discriminator for foreign keys
113pub const ENTITY_TYPE_FKS: &str = "fks";
114/// Entity type discriminator for primary keys
115pub const ENTITY_TYPE_PKS: &str = "pks";
116/// Entity type discriminator for unique constraints
117pub const ENTITY_TYPE_UNIQUES: &str = "uniques";
118/// Entity type discriminator for check constraints
119pub const ENTITY_TYPE_CHECKS: &str = "checks";
120/// Entity type discriminator for views
121pub const ENTITY_TYPE_VIEWS: &str = "views";
122/// Entity type discriminator for privileges
123pub const ENTITY_TYPE_PRIVILEGES: &str = "privileges";
124
125mod table;
126
127// Re-export Table types
128pub use table::{Table, TableDef};
129
130// =============================================================================
131// Unified Entity Enum
132// =============================================================================
133
134/// Unified `PostgreSQL` DDL entity enum for serialization
135///
136/// Uses internally-tagged enum representation where `entityType` discriminates variants.
137#[derive(Clone, Debug, PartialEq, Eq)]
138#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
139#[cfg_attr(feature = "serde", serde(tag = "entityType"))]
140pub enum PostgresEntity {
141    #[cfg_attr(feature = "serde", serde(rename = "schemas"))]
142    Schema(Schema),
143    #[cfg_attr(feature = "serde", serde(rename = "enums"))]
144    Enum(Enum),
145    #[cfg_attr(feature = "serde", serde(rename = "sequences"))]
146    Sequence(Sequence),
147    #[cfg_attr(feature = "serde", serde(rename = "roles"))]
148    Role(Role),
149    #[cfg_attr(feature = "serde", serde(rename = "policies"))]
150    Policy(Policy),
151    #[cfg_attr(feature = "serde", serde(rename = "privileges"))]
152    Privilege(Privilege),
153    #[cfg_attr(feature = "serde", serde(rename = "tables"))]
154    Table(Table),
155    #[cfg_attr(feature = "serde", serde(rename = "columns"))]
156    Column(Column),
157    #[cfg_attr(feature = "serde", serde(rename = "indexes"))]
158    Index(Index),
159    #[cfg_attr(feature = "serde", serde(rename = "fks"))]
160    ForeignKey(ForeignKey),
161    #[cfg_attr(feature = "serde", serde(rename = "pks"))]
162    PrimaryKey(PrimaryKey),
163    #[cfg_attr(feature = "serde", serde(rename = "uniques"))]
164    UniqueConstraint(UniqueConstraint),
165    #[cfg_attr(feature = "serde", serde(rename = "checks"))]
166    CheckConstraint(CheckConstraint),
167    #[cfg_attr(feature = "serde", serde(rename = "views"))]
168    View(View),
169}