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