Skip to main content

pkg/ddl

The DDL package generates SQL schema statements (CREATE TABLE, CREATE INDEX, etc.).

TableDDL

import "github.com/yaroher/ratel/pkg/ddl"

table := ddl.NewTableDDL[UsersAlias, UsersColumnAlias](
UsersAliasName,
columns,
ddl.WithSchema[UsersAlias, UsersColumnAlias]("store"),
ddl.WithIndexes(indexes...),
ddl.WithPostStatements("ALTER TABLE {table} ENABLE RLS"),
)

// Generate SQL
stmts := table.SchemaSql() // []string

Table Options

FunctionDescription
WithSchema(name)Set PostgreSQL schema
WithIndexes(idx...)Add indexes
WithUniqueColumns(cols...)Composite UNIQUE
WithPrimaryKeyColumns(cols...)Composite PRIMARY KEY
WithTableCheckConstraint(name, expr)Named CHECK
WithPostStatements(sql...)Raw SQL after CREATE TABLE

ColumnDDL

col := ddl.NewColumnDDL[UsersColumnAlias](
UsersColEmail,
ddl.TEXT,
ddl.WithNotNull[UsersColumnAlias](),
ddl.WithUnique[UsersColumnAlias](),
)

Column Options

FunctionDescription
WithNotNull()NOT NULL
WithNullable()Explicit NULL
WithUnique()UNIQUE
WithPrimaryKey()PRIMARY KEY
WithDefault(val)DEFAULT expression
WithCheck(expr)CHECK constraint
WithReferences(table, col)REFERENCES
WithOnDelete(action)ON DELETE
WithOnUpdate(action)ON UPDATE

Data Types

ConstantSQL
ddl.SMALLINTSMALLINT
ddl.INTEGERINTEGER
ddl.BIGINTBIGINT
ddl.SERIALSERIAL
ddl.SMALLSERIALSMALLSERIAL
ddl.BIGSERIALBIGSERIAL
ddl.REALREAL
ddl.DOUBLEDOUBLE PRECISION
ddl.TEXTTEXT
ddl.BOOLEANBOOLEAN
ddl.DATEDATE
ddl.TIMETIME
ddl.TIMESTAMPTIMESTAMP
ddl.TIMESTAMPTZTIMESTAMPTZ
ddl.INTERVALINTERVAL
ddl.UUIDUUID
ddl.JSONJSON
ddl.JSONBJSONB
ddl.BYTEABYTEA

Functions: ddl.Varchar(n), ddl.Char(n), ddl.Numeric(p, s), ddl.Array(type)

Index

idx := ddl.NewIndex[UsersAlias, UsersColumnAlias](
"idx_users_email",
UsersAliasName,
).OnColumns(UsersColEmail).
Unique().
Where("is_deleted = false").
Using("btree")

RawSQL

Wraps an arbitrary SQL statement for use with SchemaSQL. Use this for extensions, functions, grants, or any SQL not tied to a table definition:

ddl.SchemaSQL(
ddl.RawSQL("CREATE EXTENSION IF NOT EXISTS pg_trgm"),
ddl.RawSQL("CREATE OR REPLACE FUNCTION set_updated_at() RETURNS trigger ..."),
models.Users,
models.Orders,
)

RawSQL implements SchemaSqler, so it works anywhere tables do.

SchemaSortedStatements

Generate all CREATE statements in dependency order:

stmts, err := ddl.SchemaSortedStatements(
Users, Orders, Products, Categories,
)
// Returns CREATE SCHEMA + CREATE TABLE in topological order