196 lines
4.4 KiB
Markdown
196 lines
4.4 KiB
Markdown
# PostgreSQL Writer
|
|
|
|
Generates PostgreSQL DDL (Data Definition Language) SQL scripts from database schema information.
|
|
|
|
## Overview
|
|
|
|
The PostgreSQL Writer converts RelSpec's internal database model representation into PostgreSQL-compatible SQL DDL scripts, including CREATE TABLE statements, constraints, indexes, views, and sequences.
|
|
|
|
## Features
|
|
|
|
- Generates complete PostgreSQL DDL
|
|
- Creates schemas, tables, columns
|
|
- Defines constraints (PK, FK, unique, check)
|
|
- Creates indexes
|
|
- Generates views and sequences
|
|
- Supports migration scripts
|
|
- Includes audit triggers (optional)
|
|
- Handles PostgreSQL-specific data types
|
|
|
|
## Usage
|
|
|
|
### Basic Example
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"git.warky.dev/wdevs/relspecgo/pkg/models"
|
|
"git.warky.dev/wdevs/relspecgo/pkg/writers"
|
|
"git.warky.dev/wdevs/relspecgo/pkg/writers/pgsql"
|
|
)
|
|
|
|
func main() {
|
|
options := &writers.WriterOptions{
|
|
OutputPath: "schema.sql",
|
|
}
|
|
|
|
writer := pgsql.NewWriter(options)
|
|
err := writer.WriteDatabase(db)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
```
|
|
|
|
### CLI Examples
|
|
|
|
```bash
|
|
# Generate PostgreSQL DDL from JSON schema
|
|
relspec --input json \
|
|
--in-file schema.json \
|
|
--output pgsql \
|
|
--out-file schema.sql
|
|
|
|
# Convert GORM models to PostgreSQL DDL
|
|
relspec --input gorm \
|
|
--in-file models.go \
|
|
--output pgsql \
|
|
--out-file create_tables.sql
|
|
|
|
# Export live database schema to SQL
|
|
relspec --input pgsql \
|
|
--conn "postgres://localhost/source_db" \
|
|
--output pgsql \
|
|
--out-file backup_schema.sql
|
|
```
|
|
|
|
## Generated SQL Example
|
|
|
|
```sql
|
|
-- Schema: public
|
|
|
|
CREATE SCHEMA IF NOT EXISTS public;
|
|
|
|
-- Table: public.users
|
|
|
|
CREATE TABLE IF NOT EXISTS public.users (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
username VARCHAR(50) NOT NULL,
|
|
email VARCHAR(100) NOT NULL,
|
|
bio TEXT,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Constraints for public.users
|
|
|
|
ALTER TABLE public.users
|
|
ADD CONSTRAINT uq_users_username UNIQUE (username);
|
|
|
|
-- Indexes for public.users
|
|
|
|
CREATE INDEX idx_users_email ON public.users (email);
|
|
|
|
-- Table: public.posts
|
|
|
|
CREATE TABLE IF NOT EXISTS public.posts (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL,
|
|
title VARCHAR(200) NOT NULL,
|
|
content TEXT,
|
|
created_at TIMESTAMP DEFAULT NOW()
|
|
);
|
|
|
|
-- Foreign Keys for public.posts
|
|
|
|
ALTER TABLE public.posts
|
|
ADD CONSTRAINT fk_posts_user_id
|
|
FOREIGN KEY (user_id)
|
|
REFERENCES public.users (id)
|
|
ON DELETE CASCADE
|
|
ON UPDATE NO ACTION;
|
|
|
|
-- Indexes for public.posts
|
|
|
|
CREATE INDEX idx_posts_user_id ON public.posts (user_id);
|
|
```
|
|
|
|
## Writer Options
|
|
|
|
### Metadata Options
|
|
|
|
```go
|
|
options := &writers.WriterOptions{
|
|
OutputPath: "schema.sql",
|
|
Metadata: map[string]interface{}{
|
|
"include_drop": true, // Include DROP statements
|
|
"include_audit": true, // Include audit triggers
|
|
"if_not_exists": true, // Use IF NOT EXISTS
|
|
"migration_mode": false, // Generate migration script
|
|
},
|
|
}
|
|
```
|
|
|
|
## Features
|
|
|
|
### Full DDL Generation
|
|
|
|
Generates complete database structure:
|
|
- CREATE SCHEMA statements
|
|
- CREATE TABLE with all columns and types
|
|
- PRIMARY KEY constraints
|
|
- FOREIGN KEY constraints with actions
|
|
- UNIQUE constraints
|
|
- CHECK constraints
|
|
- CREATE INDEX statements
|
|
- CREATE VIEW statements
|
|
- CREATE SEQUENCE statements
|
|
|
|
### Migration Mode
|
|
|
|
When `migration_mode` is enabled, generates migration scripts with:
|
|
- Version tracking
|
|
- Up/down migrations
|
|
- Transactional DDL
|
|
- Rollback support
|
|
|
|
### Audit Triggers
|
|
|
|
When `include_audit` is enabled, adds:
|
|
- Created/updated timestamp triggers
|
|
- Audit logging functionality
|
|
- Change tracking
|
|
|
|
## PostgreSQL-Specific Features
|
|
|
|
- Serial types (SERIAL, BIGSERIAL)
|
|
- Advanced types (UUID, JSONB, ARRAY)
|
|
- Schema-qualified names
|
|
- Constraint actions (CASCADE, RESTRICT, SET NULL)
|
|
- Partial indexes
|
|
- Function-based indexes
|
|
- Check constraints with expressions
|
|
|
|
## Data Types
|
|
|
|
Supports all PostgreSQL data types:
|
|
- Integer types: SMALLINT, INTEGER, BIGINT, SERIAL, BIGSERIAL
|
|
- Numeric types: NUMERIC, DECIMAL, REAL, DOUBLE PRECISION
|
|
- String types: VARCHAR, CHAR, TEXT
|
|
- Date/Time: DATE, TIME, TIMESTAMP, TIMESTAMPTZ, INTERVAL
|
|
- Boolean: BOOLEAN
|
|
- Binary: BYTEA
|
|
- JSON: JSON, JSONB
|
|
- UUID: UUID
|
|
- Network: INET, CIDR, MACADDR
|
|
- Special: ARRAY, HSTORE
|
|
|
|
## Notes
|
|
|
|
- Generated SQL is formatted and readable
|
|
- Comments are preserved from source schema
|
|
- Schema names are fully qualified
|
|
- Default values are properly quoted
|
|
- Constraint names follow PostgreSQL conventions
|
|
- Compatible with PostgreSQL 12+
|