Documentation
¶
Index ¶
- Constants
- func BuildCreateContextDDL(dbType base.DXDatabaseType, namespace string) string
- func BuildGetSessionConfigExpr(dbType base.DXDatabaseType, key string) (string, error)
- func BuildGetSessionConfigSQL(dbType base.DXDatabaseType, key string) (string, []any)
- func BuildSetSessionConfigSQL(dbType base.DXDatabaseType, key string, value string) (string, []any)
- func BuildUIDDefaultExpr(dbType base.DXDatabaseType) string
- func GetSessionConfig(db *sql.DB, dbType base.DXDatabaseType, key string) (string, error)
- func NormalizeFieldValueForDBType(field *ModelDBField, dbType base.DXDatabaseType, val any) any
- func SetSessionConfig(db *sql.DB, dbType base.DXDatabaseType, key string, value string) error
- func ValidateSessionConfigKey(key string) error
- type ModelDB
- func (d *ModelDB) AddExtensions(dbType base.DXDatabaseType, extensions ...string)
- func (d *ModelDB) CatalogueAsJSON(path, commit string) ([]byte, error)
- func (d *ModelDB) CreateDDL(dbType base.DXDatabaseType) (string, error)
- func (d *ModelDB) GetExtensions(dbType base.DXDatabaseType) []string
- func (d *ModelDB) Init() error
- func (d *ModelDB) SetExtensions(dbType base.DXDatabaseType, extensions []string)
- type ModelDBAggregateType
- type ModelDBEntity
- type ModelDBEntityType
- type ModelDBField
- type ModelDBFunction
- type ModelDBFunctionParameter
- type ModelDBIndex
- func (i *ModelDBIndex) CreateDDL(dbType base.DXDatabaseType) (string, error)
- func (i *ModelDBIndex) GetOwnerName() string
- func (i *ModelDBIndex) SetInclude(columns []string) *ModelDBIndex
- func (i *ModelDBIndex) SetMethod(method ModelDBIndexMethod) *ModelDBIndex
- func (i *ModelDBIndex) SetWhere(condition string) *ModelDBIndex
- type ModelDBIndexColumn
- type ModelDBIndexMethod
- type ModelDBJoin
- type ModelDBJoinByName
- type ModelDBJoinType
- type ModelDBKeySource
- type ModelDBMaterializedView
- func NewModelDBMaterializedView(schema *ModelDBSchema, name string, fromTable *ModelDBTable, useTDE bool, ...) *ModelDBMaterializedView
- func NewModelDBMaterializedViewFromViewRef(schema *ModelDBSchema, name string, fromViewRef *ModelDBViewRef, useTDE bool, ...) *ModelDBMaterializedView
- func NewModelDBMaterializedViewRawSQL(schema *ModelDBSchema, name string, rawSQL string, useTDE bool, ...) *ModelDBMaterializedView
- func (mv *ModelDBMaterializedView) AddColumn(field *ModelDBField, alias string) *ModelDBMaterializedView
- func (mv *ModelDBMaterializedView) AddColumnExpr(expr string) *ModelDBMaterializedView
- func (mv *ModelDBMaterializedView) AddColumnFromTable(table *ModelDBEntity, field *ModelDBField, alias string) *ModelDBMaterializedView
- func (mv *ModelDBMaterializedView) AddExpression(expr string, alias string) *ModelDBMaterializedView
- func (mv *ModelDBMaterializedView) AddGroupBy(columnExpr string) *ModelDBMaterializedView
- func (mv *ModelDBMaterializedView) AddJoin(joinType ModelDBJoinType, targetTable *ModelDBEntity, fromField *ModelDBField, ...) *ModelDBMaterializedView
- func (mv *ModelDBMaterializedView) AddJoinByName(joinType ModelDBJoinType, targetViewRef *ModelDBViewRef, ...) *ModelDBMaterializedView
- func (mv *ModelDBMaterializedView) AddJoinByNameWithCondition(joinType ModelDBJoinType, targetViewRef *ModelDBViewRef, onCondition string) *ModelDBMaterializedView
- func (mv *ModelDBMaterializedView) AddOrderBy(columnExpr string, orderType ModelDBOrderByType) *ModelDBMaterializedView
- func (mv *ModelDBMaterializedView) CreateDDL(dbType base.DXDatabaseType) (string, error)
- func (mv *ModelDBMaterializedView) DropDDL(dbType base.DXDatabaseType) string
- func (mv *ModelDBMaterializedView) FullMaterializedViewName() string
- func (mv *ModelDBMaterializedView) RefreshDDL(dbType base.DXDatabaseType, concurrently bool) (string, error)
- func (mv *ModelDBMaterializedView) SetDistinct(distinct bool) *ModelDBMaterializedView
- func (mv *ModelDBMaterializedView) SetHaving(having string) *ModelDBMaterializedView
- func (mv *ModelDBMaterializedView) SetOrder(order int) *ModelDBMaterializedView
- func (mv *ModelDBMaterializedView) SetWhere(where string) *ModelDBMaterializedView
- type ModelDBOrderBy
- type ModelDBOrderByType
- type ModelDBSchema
- type ModelDBTDEConfig
- type ModelDBTable
- func (t *ModelDBTable) CreateDDL(dbType base.DXDatabaseType) (string, error)
- func (t *ModelDBTable) Delete(db *sql.DB, where string, args ...any) error
- func (t *ModelDBTable) FullTableName() string
- func (t *ModelDBTable) Insert(db *sql.DB, dbType base.DXDatabaseType, data utils.JSON) error
- func (t *ModelDBTable) SelectMany(db *sql.DB, dbType base.DXDatabaseType, where string, args ...any) ([]utils.JSON, error)
- func (t *ModelDBTable) SelectOne(db *sql.DB, dbType base.DXDatabaseType, where string, args ...any) (utils.JSON, error)
- func (t *ModelDBTable) TableName() string
- func (t *ModelDBTable) Update(db *sql.DB, dbType base.DXDatabaseType, data utils.JSON, where string, ...) error
- type ModelDBTrigger
- func (t *ModelDBTrigger) CreateDDL(dbType base.DXDatabaseType) (string, error)
- func (t *ModelDBTrigger) GetOwnerName() string
- func (t *ModelDBTrigger) SetExecuteFunction(fn *ModelDBFunction) *ModelDBTrigger
- func (t *ModelDBTrigger) SetUpdateColumns(columns []string) *ModelDBTrigger
- func (t *ModelDBTrigger) SetWhen(condition string) *ModelDBTrigger
- type ModelDBTriggerEvent
- type ModelDBTriggerScope
- type ModelDBTriggerTiming
- type ModelDBView
- func NewModelDBView(schema *ModelDBSchema, name string, fromTable *ModelDBTable) *ModelDBView
- func NewModelDBViewBuilderFunc(schema *ModelDBSchema, name string, fn func(base.DXDatabaseType) *ModelDBView) *ModelDBView
- func NewModelDBViewRawSQL(schema *ModelDBSchema, name string, rawSQL string) *ModelDBView
- func NewModelDBViewRawSQLFunc(schema *ModelDBSchema, name string, fn func(base.DXDatabaseType) string) *ModelDBView
- func (v *ModelDBView) AddColumn(field *ModelDBField, alias string) *ModelDBView
- func (v *ModelDBView) AddColumnFromTable(table *ModelDBEntity, field *ModelDBField, alias string) *ModelDBView
- func (v *ModelDBView) AddDecryptedColumn(encryptedColumn string, alias string, keyConfigName string) *ModelDBView
- func (v *ModelDBView) AddExpression(expr string, alias string) *ModelDBView
- func (v *ModelDBView) AddGroupBy(columnExpr string) *ModelDBView
- func (v *ModelDBView) AddJoin(joinType ModelDBJoinType, targetTable *ModelDBEntity, fromField *ModelDBField, ...) *ModelDBView
- func (v *ModelDBView) AddOrderBy(columnExpr string, orderType ModelDBOrderByType) *ModelDBView
- func (v *ModelDBView) CreateDDL(dbType base.DXDatabaseType) (string, error)
- func (v *ModelDBView) CreateOrReplaceDDL(dbType base.DXDatabaseType) (string, error)
- func (v *ModelDBView) DropDDL(dbType base.DXDatabaseType) string
- func (v *ModelDBView) FullViewName() string
- func (v *ModelDBView) SetDistinct(distinct bool) *ModelDBView
- func (v *ModelDBView) SetHaving(having string) *ModelDBView
- func (v *ModelDBView) SetOrder(order int) *ModelDBView
- func (v *ModelDBView) SetWhere(where string) *ModelDBView
- type ModelDBViewColumn
- type ModelDBViewRef
Constants ¶
const CatalogueFormat = "postgresql"
CatalogueFormat is the catalogue document's "catalogue" member: the database the model is rendered for.
Variables ¶
This section is empty.
Functions ¶
func BuildCreateContextDDL ¶
func BuildCreateContextDDL(dbType base.DXDatabaseType, namespace string) string
BuildCreateContextDDL generates DDL to create the application context (required for Oracle) For other databases, this returns an empty string or comment
func BuildGetSessionConfigExpr ¶
func BuildGetSessionConfigExpr(dbType base.DXDatabaseType, key string) (string, error)
BuildGetSessionConfigExpr returns the SQL expression to retrieve a session configuration value. The key is validated first to prevent SQL injection (key must be literal in view DDL). PostgreSQL: current_setting('app.key') SQL Server: SESSION_CONTEXT(N'key') Oracle: SYS_CONTEXT('APP_CTX', 'key') MariaDB/MySQL: @key
func BuildGetSessionConfigSQL ¶
func BuildGetSessionConfigSQL(dbType base.DXDatabaseType, key string) (string, []any)
BuildGetSessionConfigSQL generates a parameterized SQL query to retrieve a session configuration value. Returns the SQL string with placeholders and the corresponding args slice. PostgreSQL: SELECT current_setting($1) SQL Server: SELECT CAST(SESSION_CONTEXT(@p1) AS NVARCHAR(MAX)) Oracle: SELECT SYS_CONTEXT(:1, :2) FROM DUAL MariaDB/MySQL: SELECT @varName (varName is derived from validated key, not user data)
func BuildSetSessionConfigSQL ¶
BuildSetSessionConfigSQL generates a parameterized SQL query to set a session-level configuration variable. Returns the SQL string with placeholders and the corresponding args slice. PostgreSQL: SELECT set_config($1, $2, false) SQL Server: EXEC sp_set_session_context @key = @p1, @value = @p2 Oracle: BEGIN DBMS_SESSION.SET_CONTEXT(:1, :2, :3); END; MariaDB/MySQL: SET @varName = ? (varName is derived from validated key, not user data)
func BuildUIDDefaultExpr ¶
func BuildUIDDefaultExpr(dbType base.DXDatabaseType) string
BuildUIDDefaultExpr generates a databases-specific default expression for unique ID generation Format: hex(timestamp_microseconds) + uuid
func GetSessionConfig ¶
GetSessionConfig retrieves a session configuration value from the databases using parameterized queries This is safe from SQL injection as it validates the key and uses parameterized queries
func NormalizeFieldValueForDBType ¶
func NormalizeFieldValueForDBType(field *ModelDBField, dbType base.DXDatabaseType, val any) any
NormalizeFieldValueForDBType converts a value into the form the column it is bound to actually stores, for the cases where that differs by engine.
Today there is exactly one such case, and it exists because MariaDB has no column type that can hold a UTC offset. DataTypeISO8601 is therefore ISO-8601 text there and a real instant type everywhere else -- see the comment on DataTypeISO8601 for why -- and text needs the value written in the layout the column's ordering depends on.
Without this the driver decides, and what it decides is a connection setting. go-sql-driver/mysql encodes a time.Time as a MySQL datetime literal, which MariaDB then coerces into the VARCHAR -- not ISO-8601, no offset, and rendered in whatever zone the DSN's `loc` names. Measured against MariaDB 11.8 with one instant, 2026-08-31T19:00:00+07:00:
loc unset (UTC) stored "2026-08-31 12:00:00" loc=Asia/Jakarta stored "2026-08-31 19:00:00" through this func stored "2026-08-31T12:00:00.000000000Z" either way
One instant, two different strings, and nothing in the column says which rule produced it. That is the exact failure DataTypeISO8601 exists to prevent, so the DDL change and this conversion are one change; neither is correct alone. Text that is not ISO-8601 is also strictly worse than the DATETIME it replaced, which at least had date semantics.
A string that already parses as a timestamp is re-rendered rather than passed through, so a caller handing over "2026-08-31T12:00:00+07:00" gets the same instant, stored in the one layout that sorts. A string that does not parse is left exactly as it was: this function normalises, it does not validate, and swallowing an unparseable value here would hide it from the error the database is about to raise.
func SetSessionConfig ¶
SetSessionConfig executes the SET command on a databases connection using parameterized queries This is safe from SQL injection as it validates the key and uses parameterized queries for the value
func ValidateSessionConfigKey ¶
ValidateSessionConfigKey validates that a session config key contains only safe characters Allowed: alphanumeric, dots, underscores Returns error if the key contains unsafe characters
Types ¶
type ModelDB ¶
type ModelDB struct {
Name string
Extensions map[base.DXDatabaseType][]string // Database-specific extensions/features
Schemas []*ModelDBSchema
}
ModelDB represents a databases with extensions and schemas
func NewModelDB ¶
func NewModelDB(name string, extensions map[base.DXDatabaseType][]string) *ModelDB
NewModelDB creates a new databases with optional extensions
func (*ModelDB) AddExtensions ¶
func (d *ModelDB) AddExtensions(dbType base.DXDatabaseType, extensions ...string)
AddExtensions adds extensions for a specific databases type
func (*ModelDB) CatalogueAsJSON ¶ added in v1.126.7
CatalogueAsJSON returns the model's catalogue document. path and commit are written as the document's "path" and "commit" members, which name the source the catalogue was made from and the commit that last changed it; the model cannot know them, so the caller passes them, or "" for none.
func (*ModelDB) CreateDDL ¶
func (d *ModelDB) CreateDDL(dbType base.DXDatabaseType) (string, error)
CreateDDL generates DDL script for the databases including extensions and all schemas
func (*ModelDB) GetExtensions ¶
func (d *ModelDB) GetExtensions(dbType base.DXDatabaseType) []string
GetExtensions returns extensions for a specific databases type
func (*ModelDB) Init ¶
Init resolves all field References to ResolvedReferenceField pointers. Tables are processed in Order to ensure referenced tables are resolved first. Returns an error if any References string cannot be resolved.
func (*ModelDB) SetExtensions ¶
func (d *ModelDB) SetExtensions(dbType base.DXDatabaseType, extensions []string)
SetExtensions sets extensions for a specific databases type (replaces existing)
type ModelDBAggregateType ¶
type ModelDBAggregateType int
const ( ModelDBAggregateCount ModelDBAggregateType = iota ModelDBAggregateSum ModelDBAggregateAvg ModelDBAggregateMin ModelDBAggregateMax )
func (ModelDBAggregateType) String ¶
func (a ModelDBAggregateType) String() string
type ModelDBEntity ¶
type ModelDBEntity struct {
Name string
Type ModelDBEntityType
Order int
Schema *ModelDBSchema
}
func (*ModelDBEntity) FullName ¶
func (t *ModelDBEntity) FullName() string
FullName returns the entity name with schema prefix
type ModelDBEntityType ¶
type ModelDBEntityType int
const ( ModelDBEntityTypeTable ModelDBEntityType = iota ModelDBEntityTypeView ModelDBEntityTypeMaterializedView ModelDBEntityTypeFunction ModelDBEntityTypeIndex ModelDBEntityTypeTrigger )
type ModelDBField ¶
type ModelDBField struct {
Owner *ModelDBTable
Order int
Type types.DataType
IsPrimaryKey bool
IsAutoIncrement bool
IsNotNull bool
IsUnique bool
DefaultValue any // SQL expression for DEFAULT clause (used when DefaultValueByDBType not specified)
DefaultValueByDBType map[base.DXDatabaseType]any // Database-specific default values. Keys: "postgresql", "sqlserver", "oracle", "mariadb"
References string // Foreign key reference in format "schema.table.field"
ResolvedReferenceField *ModelDBField // Resolved reference field pointer (set by NewModelDBTable)
// for encrypted field only
DecryptedFieldName string
EncryptionKeySource ModelDBKeySource // "config" (PostgreSQL current_setting), "literal", "env"
EncryptionKeyValue string // e.g., "app.encryption_key" for config, or literal key value
HashFieldName string // e.g., "fullname_hashed" - companion hash field name
HashSaltKeySource ModelDBKeySource // "config", "literal", "env"
HashSaltKeyValue string // salt value or config name
// for generated/computed columns
IsGenerated bool // true = this column is generated/computed
GeneratedExpression string // default SQL expression (used when GeneratedExpressionByDBType not specified)
GeneratedExpressionByDBType map[base.DXDatabaseType]string // database-specific expressions (syntax varies across engines)
IsStored bool // true = STORED/PERSISTED, false = VIRTUAL
}
func (*ModelDBField) GetName ¶
func (f *ModelDBField) GetName() string
type ModelDBFunction ¶
type ModelDBFunction struct {
ModelDBEntity
Parameters []ModelDBFunctionParameter
ReturnType string // Return type (e.g., "TRIGGER", "INTEGER", "TABLE", "VOID")
ReturnTypeByDB map[base.DXDatabaseType]string // Database-specific return type override
Language string // plpgsql, sql, etc.
Body string // Function body (between $$ and $$)
BodyByDB map[base.DXDatabaseType]string // Database-specific body override
IsReplace bool // CREATE OR REPLACE
Volatility string // VOLATILE, STABLE, IMMUTABLE (PostgreSQL)
SecurityDefiner bool // SECURITY DEFINER vs SECURITY INVOKER
}
ModelDBFunction represents a databases function or stored procedure
func NewModelDBFunction ¶
func NewModelDBFunction(schema *ModelDBSchema, name string, order int, returnType string, language string, body string) *ModelDBFunction
NewModelDBFunction creates a new databases function and registers it with the schema
func (*ModelDBFunction) AddParameter ¶
func (f *ModelDBFunction) AddParameter(name string, dataType string, mode string, defaultValue string) *ModelDBFunction
AddParameter adds a parameter to the function
func (*ModelDBFunction) CreateDDL ¶
func (f *ModelDBFunction) CreateDDL(dbType base.DXDatabaseType) (string, error)
CreateDDL generates DDL script for the function based on databases type
func (*ModelDBFunction) SetBodyByDB ¶
func (f *ModelDBFunction) SetBodyByDB(dbType base.DXDatabaseType, body string) *ModelDBFunction
SetBodyByDB sets databases-specific function body
type ModelDBFunctionParameter ¶
type ModelDBFunctionParameter struct {
Name string
DataType string // Generic type string
DataTypeByDB map[base.DXDatabaseType]string // Database-specific type override
Mode string // IN, OUT, INOUT (default: IN)
DefaultValue string // Optional default value
}
ModelDBFunctionParameter represents a function parameter
type ModelDBIndex ¶
type ModelDBIndex struct {
ModelDBEntity
Columns []ModelDBIndexColumn
IsUnique bool
Method ModelDBIndexMethod // BTREE, HASH, GIST, etc.
Where string // Partial index condition (PostgreSQL)
Include []string // INCLUDE columns (PostgreSQL 11+)
Tablespace string // Optional tablespace
Concurrent bool // CREATE INDEX CONCURRENTLY (PostgreSQL)
IfNotExists bool // CREATE INDEX IF NOT EXISTS
// Owner reference - either Table or MaterializedView (set by NewDBIndex*)
OwnerTable *ModelDBTable
OwnerMaterializedView *ModelDBMaterializedView
}
ModelDBIndex represents a databases index
func NewModelDBIndexForMaterializedView ¶
func NewModelDBIndexForMaterializedView(mv *ModelDBMaterializedView, name string, order int, columns []ModelDBIndexColumn, isUnique bool) *ModelDBIndex
NewDBIndexForMaterializedView creates a new index for a materialized view
func NewModelDBIndexForTable ¶
func NewModelDBIndexForTable(table *ModelDBTable, name string, order int, columns []ModelDBIndexColumn, isUnique bool) *ModelDBIndex
NewDBIndexForTable creates a new index for a table
func (*ModelDBIndex) CreateDDL ¶
func (i *ModelDBIndex) CreateDDL(dbType base.DXDatabaseType) (string, error)
CreateDDL generates DDL script for the index based on databases type
func (*ModelDBIndex) GetOwnerName ¶
func (i *ModelDBIndex) GetOwnerName() string
GetOwnerName returns the name of the table or materialized view that owns this index
func (*ModelDBIndex) SetInclude ¶
func (i *ModelDBIndex) SetInclude(columns []string) *ModelDBIndex
SetInclude sets the INCLUDE columns
func (*ModelDBIndex) SetMethod ¶
func (i *ModelDBIndex) SetMethod(method ModelDBIndexMethod) *ModelDBIndex
SetMethod sets the index method
func (*ModelDBIndex) SetWhere ¶
func (i *ModelDBIndex) SetWhere(condition string) *ModelDBIndex
SetWhere sets the partial index condition
type ModelDBIndexColumn ¶
type ModelDBIndexColumn struct {
Name string
Order string // ASC, DESC, empty for default
NullsOrder string // NULLS FIRST, NULLS LAST, empty for default
}
ModelDBIndexColumn represents a column in the index
type ModelDBIndexMethod ¶
type ModelDBIndexMethod string
ModelDBIndexMethod represents the index method/type
const ( ModelDBIndexMethodBTree ModelDBIndexMethod = "BTREE" ModelDBIndexMethodHash ModelDBIndexMethod = "HASH" ModelDBIndexMethodGiST ModelDBIndexMethod = "GIST" ModelDBIndexMethodGIN ModelDBIndexMethod = "GIN" ModelDBIndexMethodSPGiST ModelDBIndexMethod = "SPGIST" ModelDBIndexMethodBRIN ModelDBIndexMethod = "BRIN" )
type ModelDBJoin ¶
type ModelDBJoin struct {
JoinType ModelDBJoinType
TargetTable *ModelDBEntity // The table or view to join TO (changed from *ModelDBTable to support views)
TargetAlias string // Optional: alias for the target table/view (e.g., "st", "st2" for multiple joins)
FromLocalField *ModelDBField // ModelDBField from the source/left table
ToTargetField *ModelDBField // ModelDBField from the target/right table
TargetTableName string // Optional: override target table name (for self-joins or subqueries)
}
ModelDBJoin represents a join between two tables or views
type ModelDBJoinByName ¶
type ModelDBJoinByName struct {
JoinType ModelDBJoinType
TargetViewRef *ModelDBViewRef // The view/table to join TO
FromFieldExpr string // ModelDBField expression from source (e.g., "vfe.id" or just "id")
ToFieldExpr string // ModelDBField expression from target (e.g., "fee.user_role_membership_id")
OnCondition string // Optional: full ON condition override (e.g., "a.id = b.id AND a.type = b.type")
}
ModelDBJoinByName represents a join using string-based table/field names Use this when joining to views or when *ModelDBField references are not available
type ModelDBJoinType ¶
type ModelDBJoinType int
const ( ModelDBJoinTypeInner ModelDBJoinType = iota ModelDBJoinTypeLeft ModelDBJoinTypeRight ModelDBJoinTypeFull )
func (ModelDBJoinType) String ¶
func (j ModelDBJoinType) String() string
type ModelDBKeySource ¶
type ModelDBKeySource int
const ( ModelDBKeySourceRaw ModelDBKeySource = iota ModelDBKeySourceEnv ModelDBKeySourceConfig ModelDBKeySourceDbSessionCurrentSetting ModelDBKeySourceSecureMemory )
type ModelDBMaterializedView ¶
type ModelDBMaterializedView struct {
ModelDBEntity // Embedded base entity (Name, Type, Order, Schema)
UseTDE bool // If true, use USING tde_heap (PostgreSQL specific)
UniqueIndexColumns []string // Columns for unique index (required for CONCURRENTLY refresh)
// Builder pattern fields - Source table/view (use ONE of these)
FromTable *ModelDBTable // Main table to select from (when using ModelDBTable)
FromViewRef *ModelDBViewRef // Main view/table to select from (when using view reference by name)
// Builder pattern fields - Columns and clauses
Columns []ModelDBViewColumn // Columns to select (for ModelDBTable fields)
ColumnExprs []string // Column expressions as strings (for view references)
Joins []ModelDBJoin // Join clauses (for ModelDBTable)
JoinsByName []ModelDBJoinByName // Join clauses using view/table names
Where string // WHERE clause (without the "WHERE" keyword)
GroupBy []string // GROUP BY columns (field names or expressions)
Having string // HAVING clause (without the "HAVING" keyword)
OrderBy []ModelDBOrderBy // ORDER BY clause
Distinct bool // SELECT DISTINCT
// RawSQL for complex queries (CTEs, RECURSIVE, window functions, etc.)
// When set, bypasses builder pattern entirely
RawSQL string
// Indexes on this materialized view
Indexes []*ModelDBIndex
}
ModelDBMaterializedView represents a materialized view in the databases Supports both builder pattern (for simple queries) and RawSQL (for complex queries) Low IQ Tax Code Principle: Simple queries use builder, complex queries use RawSQL
func NewModelDBMaterializedView ¶
func NewModelDBMaterializedView(schema *ModelDBSchema, name string, fromTable *ModelDBTable, useTDE bool, uniqueIndexColumns []string) *ModelDBMaterializedView
NewModelDBMaterializedView creates a materialized view using builder pattern
func NewModelDBMaterializedViewFromViewRef ¶
func NewModelDBMaterializedViewFromViewRef(schema *ModelDBSchema, name string, fromViewRef *ModelDBViewRef, useTDE bool, uniqueIndexColumns []string) *ModelDBMaterializedView
NewModelDBMaterializedViewFromViewRef creates a materialized view from a view reference Use this when the source is a view (not a ModelDBTable)
func NewModelDBMaterializedViewRawSQL ¶
func NewModelDBMaterializedViewRawSQL(schema *ModelDBSchema, name string, rawSQL string, useTDE bool, uniqueIndexColumns []string) *ModelDBMaterializedView
NewModelDBMaterializedViewRawSQL creates a materialized view with raw SQL Use this for complex queries (CTEs, RECURSIVE, window functions, etc.)
func (*ModelDBMaterializedView) AddColumn ¶
func (mv *ModelDBMaterializedView) AddColumn(field *ModelDBField, alias string) *ModelDBMaterializedView
AddColumn adds a simple column from the main table
func (*ModelDBMaterializedView) AddColumnExpr ¶
func (mv *ModelDBMaterializedView) AddColumnExpr(expr string) *ModelDBMaterializedView
AddColumnExpr adds a column expression string (for use with FromViewRef) Example: "vfe.id AS user_role_membership_id" or "COUNT(*) as total"
func (*ModelDBMaterializedView) AddColumnFromTable ¶
func (mv *ModelDBMaterializedView) AddColumnFromTable(table *ModelDBEntity, field *ModelDBField, alias string) *ModelDBMaterializedView
AddColumnFromTable adds a column from a joined table
func (*ModelDBMaterializedView) AddExpression ¶
func (mv *ModelDBMaterializedView) AddExpression(expr string, alias string) *ModelDBMaterializedView
AddExpression adds a raw SQL expression (like COUNT(*), SUM(amount))
func (*ModelDBMaterializedView) AddGroupBy ¶
func (mv *ModelDBMaterializedView) AddGroupBy(columnExpr string) *ModelDBMaterializedView
AddGroupBy adds a GROUP BY column
func (*ModelDBMaterializedView) AddJoin ¶
func (mv *ModelDBMaterializedView) AddJoin(joinType ModelDBJoinType, targetTable *ModelDBEntity, fromField *ModelDBField, toField *ModelDBField) *ModelDBMaterializedView
AddJoin adds a join to another table
func (*ModelDBMaterializedView) AddJoinByName ¶
func (mv *ModelDBMaterializedView) AddJoinByName(joinType ModelDBJoinType, targetViewRef *ModelDBViewRef, fromFieldExpr, toFieldExpr string) *ModelDBMaterializedView
AddJoinByName adds a join to a view/table by name fromFieldExpr: field from source table (e.g., "vfe.id") toFieldExpr: field from target (e.g., "fee.user_role_membership_id")
func (*ModelDBMaterializedView) AddJoinByNameWithCondition ¶
func (mv *ModelDBMaterializedView) AddJoinByNameWithCondition(joinType ModelDBJoinType, targetViewRef *ModelDBViewRef, onCondition string) *ModelDBMaterializedView
AddJoinByNameWithCondition adds a join with a custom ON condition onCondition: full ON condition (e.g., "a.id = b.id AND a.type = b.type")
func (*ModelDBMaterializedView) AddOrderBy ¶
func (mv *ModelDBMaterializedView) AddOrderBy(columnExpr string, orderType ModelDBOrderByType) *ModelDBMaterializedView
AddOrderBy adds an ORDER BY column
func (*ModelDBMaterializedView) CreateDDL ¶
func (mv *ModelDBMaterializedView) CreateDDL(dbType base.DXDatabaseType) (string, error)
CreateDDL generates the CREATE MATERIALIZED VIEW DDL statement
func (*ModelDBMaterializedView) DropDDL ¶
func (mv *ModelDBMaterializedView) DropDDL(dbType base.DXDatabaseType) string
DropDDL generates the DROP MATERIALIZED VIEW DDL statement
func (*ModelDBMaterializedView) FullMaterializedViewName ¶
func (mv *ModelDBMaterializedView) FullMaterializedViewName() string
FullMaterializedViewName returns the materialized view name with schema prefix
func (*ModelDBMaterializedView) RefreshDDL ¶
func (mv *ModelDBMaterializedView) RefreshDDL(dbType base.DXDatabaseType, concurrently bool) (string, error)
RefreshDDL generates the REFRESH MATERIALIZED VIEW DDL statement
func (*ModelDBMaterializedView) SetDistinct ¶
func (mv *ModelDBMaterializedView) SetDistinct(distinct bool) *ModelDBMaterializedView
SetDistinct enables SELECT DISTINCT
func (*ModelDBMaterializedView) SetHaving ¶
func (mv *ModelDBMaterializedView) SetHaving(having string) *ModelDBMaterializedView
SetHaving sets the HAVING clause
func (*ModelDBMaterializedView) SetOrder ¶
func (mv *ModelDBMaterializedView) SetOrder(order int) *ModelDBMaterializedView
SetOrder sets the view Order (for global view creation ordering)
func (*ModelDBMaterializedView) SetWhere ¶
func (mv *ModelDBMaterializedView) SetWhere(where string) *ModelDBMaterializedView
SetWhere sets the WHERE clause
type ModelDBOrderBy ¶
type ModelDBOrderBy struct {
ColumnExpr string // Can be field name or expression like "COUNT(*)"
OrderByType ModelDBOrderByType
}
type ModelDBOrderByType ¶
type ModelDBOrderByType int
const ( ModelDBOrderByTypeAsc ModelDBOrderByType = iota ModelDBOrderByTypeDesc )
func (ModelDBOrderByType) String ¶
func (o ModelDBOrderByType) String() string
type ModelDBSchema ¶
type ModelDBSchema struct {
Name string
Order int
DB *ModelDB
Functions []*ModelDBFunction
Tables []*ModelDBTable
Views []*ModelDBView
MaterializedViews []*ModelDBMaterializedView
Triggers []*ModelDBTrigger // Pointer list to all triggers in this schema (owned by tables)
}
func NewModelDBSchema ¶
func NewModelDBSchema(db *ModelDB, name string, order int) *ModelDBSchema
NewModelDBSchema creates a new databases schema and registers it with the ModelDB
func (*ModelDBSchema) CreateDDL ¶
func (s *ModelDBSchema) CreateDDL(dbType base.DXDatabaseType) (string, error)
CreateDDL generates DDL script for the schema and all its entities Order: function -> table -> (index table) -> trigger table -> view -> materialized view -> index materialized view
type ModelDBTDEConfig ¶
type ModelDBTDEConfig struct {
// PostgreSQL: Table access method name for TDE (e.g., "tde_heap")
ModelDBPostgreSQLAccessMethod string
// Oracle: Encrypted tablespace name where the table will be created
OracleTablespace string
// SQLServer: Flag indicating that databases-level TDE should be enabled
// No per-table syntax is needed; this is for documentation/validation purposes
SQLServerTDEEnabled bool
// MariaDB: Encryption option for InnoDB tables ('Y' for enabled, 'N' or empty for disabled)
MariaDBEncryption string
}
ModelDBTDEConfig holds Transparent Data Encryption configuration for different databases types Each databases has different TDE approaches: - PostgreSQL: Uses table access method (e.g., "tde_heap" with pg_tde extension) - Oracle: Uses encrypted tablespace (tables created in pre-configured encrypted tablespace) - SQL Server: Database-level TDE (no per-table syntax, just a marker that TDE is expected) - MariaDB/MySQL: Uses InnoDB table encryption option (ENCRYPTION='Y')
func (ModelDBTDEConfig) IsEnabled ¶
func (t ModelDBTDEConfig) IsEnabled(dbType base.DXDatabaseType) bool
IsEnabled checks if TDE is configured for the specified databases type key
type ModelDBTable ¶
type ModelDBTable struct {
ModelDBEntity
Fields map[string]*ModelDBField
TDE ModelDBTDEConfig // Database-specific TDE configuration
UseTableSuffix bool
PhysicalTableName string
Indexes []*ModelDBIndex // Indexes on this table
Triggers []*ModelDBTrigger // Triggers on this table
}
func NewModelDBTable ¶
func NewModelDBTable(schema *ModelDBSchema, name string, order int, fields map[string]*ModelDBField, tde ModelDBTDEConfig) *ModelDBTable
NewModelDBTable creates a new databases table and registers it with the schema. Note: ModelDBField References are resolved lazily by ModelDB.Init() using the Order field.
func (*ModelDBTable) CreateDDL ¶
func (t *ModelDBTable) CreateDDL(dbType base.DXDatabaseType) (string, error)
CreateDDL generates a DDL script for the table based on databases type
func (*ModelDBTable) FullTableName ¶
func (t *ModelDBTable) FullTableName() string
FullTableName returns the table name with schema prefix if schema is set
func (*ModelDBTable) Insert ¶
func (t *ModelDBTable) Insert(db *sql.DB, dbType base.DXDatabaseType, data utils.JSON) error
Insert inserts a new row into the table
func (*ModelDBTable) SelectMany ¶
func (t *ModelDBTable) SelectMany(db *sql.DB, dbType base.DXDatabaseType, where string, args ...any) ([]utils.JSON, error)
SelectMany selects multiple rows from the table
func (*ModelDBTable) SelectOne ¶
func (t *ModelDBTable) SelectOne(db *sql.DB, dbType base.DXDatabaseType, where string, args ...any) (utils.JSON, error)
SelectOne selects a single row from the table
func (*ModelDBTable) TableName ¶
func (t *ModelDBTable) TableName() string
TableName returns the physical table name (without a schema prefix)
type ModelDBTrigger ¶
type ModelDBTrigger struct {
ModelDBEntity
Timing ModelDBTriggerTiming
Events []ModelDBTriggerEvent // INSERT, UPDATE, DELETE, TRUNCATE
UpdateColumns []string // Columns for UPDATE OF (optional)
Scope ModelDBTriggerScope // FOR EACH ROW or FOR EACH STATEMENT
When string // WHEN condition (optional)
ExecuteFunction *ModelDBFunction // Reference to the function to execute
ExecuteFunctionName string // Or just the function name if not using ModelDBFunction reference
IsConstraint bool // Constraint trigger (PostgreSQL)
Deferrable bool // DEFERRABLE (constraint triggers)
InitiallyDeferred bool // INITIALLY DEFERRED (constraint triggers)
// Owner reference - the table this trigger is on
OwnerTable *ModelDBTable
}
ModelDBTrigger represents a databases trigger
func NewModelDBTrigger ¶
func NewModelDBTrigger(table *ModelDBTable, name string, order int, timing ModelDBTriggerTiming, events []ModelDBTriggerEvent, scope ModelDBTriggerScope, executeFunctionName string) *ModelDBTrigger
NewModelDBTrigger creates a new trigger for a table
func (*ModelDBTrigger) CreateDDL ¶
func (t *ModelDBTrigger) CreateDDL(dbType base.DXDatabaseType) (string, error)
CreateDDL generates DDL script for the trigger based on databases type
func (*ModelDBTrigger) GetOwnerName ¶
func (t *ModelDBTrigger) GetOwnerName() string
GetOwnerName returns the name of the table that owns this trigger
func (*ModelDBTrigger) SetExecuteFunction ¶
func (t *ModelDBTrigger) SetExecuteFunction(fn *ModelDBFunction) *ModelDBTrigger
SetExecuteFunction sets the function reference
func (*ModelDBTrigger) SetUpdateColumns ¶
func (t *ModelDBTrigger) SetUpdateColumns(columns []string) *ModelDBTrigger
SetUpdateColumns sets the columns for UPDATE OF
func (*ModelDBTrigger) SetWhen ¶
func (t *ModelDBTrigger) SetWhen(condition string) *ModelDBTrigger
SetWhen sets the WHEN condition
type ModelDBTriggerEvent ¶
type ModelDBTriggerEvent string
ModelDBTriggerEvent represents the event that fires the trigger
const ( ModelDBTriggerEventInsert ModelDBTriggerEvent = "INSERT" ModelDBTriggerEventUpdate ModelDBTriggerEvent = "UPDATE" ModelDBTriggerEventDelete ModelDBTriggerEvent = "DELETE" ModelDBTriggerEventTruncate ModelDBTriggerEvent = "TRUNCATE" )
type ModelDBTriggerScope ¶
type ModelDBTriggerScope string
DBTriggerScope represents the trigger scope
const ( ModelDBTriggerScopeRow ModelDBTriggerScope = "FOR EACH ROW" ModelDBTriggerScopeStatement ModelDBTriggerScope = "FOR EACH STATEMENT" )
type ModelDBTriggerTiming ¶
type ModelDBTriggerTiming string
ModelDBTriggerTiming represents when the trigger fires
const ( ModelDBTriggerTimingBefore ModelDBTriggerTiming = "BEFORE" ModelDBTriggerTimingAfter ModelDBTriggerTiming = "AFTER" ModelDBTriggerTimingInsteadOf ModelDBTriggerTiming = "INSTEAD OF" )
type ModelDBView ¶
type ModelDBView struct {
ModelDBEntity // Embedded base entity (Name, Type, Order, Schema)
FromTable *ModelDBTable // Main table to select from
Columns []ModelDBViewColumn // Columns to select
Joins []ModelDBJoin // Join clauses
Where string // WHERE clause (without the "WHERE" keyword)
GroupBy []string // GROUP BY columns (field names or expressions)
Having string // HAVING clause (without the "HAVING" keyword)
OrderBy []ModelDBOrderBy // ORDER BY clause
Distinct bool // SELECT DISTINCT
RawSQL string // Raw SQL for complex views (bypasses builder when set)
RawSQLFunc func(base.DXDatabaseType) string // DB-specific raw SQL generator (overrides RawSQL and builder when set)
ViewBuilderFunc func(base.DXDatabaseType) *ModelDBView // DB-specific structured view builder (overrides builder when set)
}
func NewModelDBView ¶
func NewModelDBView(schema *ModelDBSchema, name string, fromTable *ModelDBTable) *ModelDBView
NewDBView creates a new databases view and registers it with the schema
func NewModelDBViewBuilderFunc ¶
func NewModelDBViewBuilderFunc(schema *ModelDBSchema, name string, fn func(base.DXDatabaseType) *ModelDBView) *ModelDBView
NewModelDBViewBuilderFunc creates a view whose structure is built per DB type using the structured ModelDBView builder. Use this for views that need DB-specific expressions (e.g. array aggregation) but want to keep the structured style.
func NewModelDBViewRawSQL ¶
func NewModelDBViewRawSQL(schema *ModelDBSchema, name string, rawSQL string) *ModelDBView
NewDBViewRawSQL creates a databases view with raw SQL definition Use this for complex views that are difficult to express with the builder pattern
func NewModelDBViewRawSQLFunc ¶
func NewModelDBViewRawSQLFunc(schema *ModelDBSchema, name string, fn func(base.DXDatabaseType) string) *ModelDBView
NewModelDBViewRawSQLFunc creates a view whose body SQL is generated per DB type. Use this for views that use DB-specific syntax (array aggregation, string aggregation, etc.).
func (*ModelDBView) AddColumn ¶
func (v *ModelDBView) AddColumn(field *ModelDBField, alias string) *ModelDBView
AddColumn adds a simple column from the main table
func (*ModelDBView) AddColumnFromTable ¶
func (v *ModelDBView) AddColumnFromTable(table *ModelDBEntity, field *ModelDBField, alias string) *ModelDBView
AddColumnFromTable adds a column from a joined table
func (*ModelDBView) AddDecryptedColumn ¶
func (v *ModelDBView) AddDecryptedColumn(encryptedColumn string, alias string, keyConfigName string) *ModelDBView
AddDecryptedColumn adds a column that decrypts an encrypted physical column. encryptedColumn: the physical column name (e.g., "fullname_encrypted") alias: the name to expose in the view (e.g., "fullname") keyConfigName: the session config key for the encryption key (e.g., "app.encryption_key")
func (*ModelDBView) AddExpression ¶
func (v *ModelDBView) AddExpression(expr string, alias string) *ModelDBView
AddExpression adds a raw SQL expression (like COUNT(*), SUM(amount))
func (*ModelDBView) AddGroupBy ¶
func (v *ModelDBView) AddGroupBy(columnExpr string) *ModelDBView
AddGroupBy adds a GROUP BY column
func (*ModelDBView) AddJoin ¶
func (v *ModelDBView) AddJoin(joinType ModelDBJoinType, targetTable *ModelDBEntity, fromField *ModelDBField, toField *ModelDBField) *ModelDBView
AddJoin adds a join to another table
func (*ModelDBView) AddOrderBy ¶
func (v *ModelDBView) AddOrderBy(columnExpr string, orderType ModelDBOrderByType) *ModelDBView
AddOrderBy adds an ORDER BY column
func (*ModelDBView) CreateDDL ¶
func (v *ModelDBView) CreateDDL(dbType base.DXDatabaseType) (string, error)
CreateDDL generates the CREATE VIEW DDL statement
func (*ModelDBView) CreateOrReplaceDDL ¶
func (v *ModelDBView) CreateOrReplaceDDL(dbType base.DXDatabaseType) (string, error)
CreateOrReplaceDDL generates CREATE OR REPLACE VIEW (where supported)
func (*ModelDBView) DropDDL ¶
func (v *ModelDBView) DropDDL(dbType base.DXDatabaseType) string
DropDDL generates the DROP VIEW DDL statement
func (*ModelDBView) FullViewName ¶
func (v *ModelDBView) FullViewName() string
FullViewName returns the view name with a schema prefix
func (*ModelDBView) SetDistinct ¶
func (v *ModelDBView) SetDistinct(distinct bool) *ModelDBView
SetDistinct enables SELECT DISTINCT
func (*ModelDBView) SetHaving ¶
func (v *ModelDBView) SetHaving(having string) *ModelDBView
SetHaving sets the HAVING clause
func (*ModelDBView) SetOrder ¶
func (v *ModelDBView) SetOrder(order int) *ModelDBView
SetOrder sets the view Order (for global view creation ordering)
func (*ModelDBView) SetWhere ¶
func (v *ModelDBView) SetWhere(where string) *ModelDBView
SetWhere sets the WHERE clause
type ModelDBViewColumn ¶
type ModelDBViewColumn struct {
SourceTable *ModelDBEntity // Which table this column comes from (nil = from main table)
SourceField *ModelDBField // The field reference (nil if using Expression)
Expression string // Raw SQL expression like "COUNT(*)", "SUM(amount)", etc.
Alias string // AS alias_name (required if Expression is used)
}
DBViewColumn represents a column in the SELECT clause
type ModelDBViewRef ¶
type ModelDBViewRef struct {
Schema *ModelDBSchema // Schema pointer (e.g., PartnerManagementSchema)
Name string // View/table name (e.g., "v_field_executor")
Alias string // Optional alias for use in queries (e.g., "vfe")
}
DBViewRef represents a reference to a view or table by name (for use in FROM/JOIN) Use this when you need to reference a view or table that is not defined as ModelDBTable
func NewModelDBViewRef ¶
func NewModelDBViewRef(schema *ModelDBSchema, name, alias string) *ModelDBViewRef
NewDBViewRef creates a new view reference using schema pointer and name string Use this when the view/table is not defined as a Go variable
func NewModelDBViewRefFromTable ¶
func NewModelDBViewRefFromTable(table *ModelDBTable, alias string) *ModelDBViewRef
NewDBViewRefFromTable creates a view reference from an existing ModelDBTable Use this when referencing a table that is defined as *ModelDBTable in Go
func NewModelDBViewRefFromView ¶
func NewModelDBViewRefFromView(view *ModelDBView, alias string) *ModelDBViewRef
NewDBViewRefFromView creates a view reference from an existing ModelDBView Use this when referencing a view that is defined as *ModelDBView in Go
func (*ModelDBViewRef) FullName ¶
func (v *ModelDBViewRef) FullName() string
FullName returns schema.name
func (*ModelDBViewRef) RefName ¶
func (v *ModelDBViewRef) RefName() string
RefName returns the alias if set, otherwise the full name (for use in SELECT/JOIN ON)
Source Files
¶
- database_model.go
- database_model_catalogue.go
- database_model_db.go
- database_model_entity.go
- database_model_function.go
- database_model_index.go
- database_model_materialized_view.go
- database_model_quote.go
- database_model_schema.go
- database_model_table.go
- database_model_tde.go
- database_model_trigger.go
- database_model_value.go
- database_model_view.go