Documentation
ΒΆ
Overview ΒΆ
Package quark provides a modern, type-safe ORM for Go. It supports multiple SQL dialects and is designed to be framework-agnostic.
Index ΒΆ
- Variables
- func Call(ctx context.Context, provider ClientProvider, procedure string, args ...any) error
- func Notify(ctx context.Context, provider ClientProvider, channel, payload string) error
- func RegisterDialect(name string, d Dialect)
- type AfterCreateHook
- type AfterDeleteHook
- type AfterUpdateHook
- type BaseMiddleware
- type BaseQuery
- type BeforeCreateHook
- type BeforeDeleteHook
- type BeforeUpdateHook
- type CacheConfig
- type CacheStore
- type Client
- func (c *Client) AddForeignKey(ctx context.Context, table, constraintName string, columns []string, ...) error
- func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error)
- func (c *Client) Close() error
- func (c *Client) CreateIndex(ctx context.Context, table, indexName string, columns []string, unique bool) error
- func (c *Client) Dialect() Dialect
- func (c *Client) Exec(ctx context.Context, query string, args ...any) error
- func (c *Client) GetClient(ctx context.Context) (*Client, error)
- func (c *Client) Migrate(ctx context.Context, models ...any) error
- func (c *Client) Raw() *sql.DB
- func (c *Client) RawQuery(ctx context.Context, query string, args ...any) (*sql.Rows, error)
- func (c *Client) Sync(ctx context.Context, opts SyncOptions, models ...any) error
- func (c *Client) Tx(ctx context.Context, fn func(tx *Tx) error) error
- func (c *Client) Validate(ctx context.Context, model any) error
- type ClientProvider
- type Cursor
- type Dialect
- type EventBus
- type EventListener
- type EventPayload
- type ExecFunc
- type Executor
- type FieldMeta
- type Limits
- type MSSQLDialect
- func (m *MSSQLDialect) AlterTableAddColumn(table, column, dataType string) string
- func (m *MSSQLDialect) AlterTableAlterColumn(table, column, newDataType string) string
- func (m *MSSQLDialect) AlterTableDropColumn(table, column string) string
- func (m *MSSQLDialect) BuildProcedureCall(procedure string, argCount int) string
- func (m *MSSQLDialect) BuildRoutineQuery(routine string, argCount int) string
- func (m *MSSQLDialect) CurrentTimestamp() string
- func (m *MSSQLDialect) JSONExtract(column, path string) string
- func (m *MSSQLDialect) LastInsertIDQuery(table, pkColumn string) string
- func (m *MSSQLDialect) LimitOffset(limit, offset int) string
- func (d *MSSQLDialect) Name() string
- func (m *MSSQLDialect) Placeholder(index int) string
- func (m *MSSQLDialect) Placeholders(n int) []string
- func (m *MSSQLDialect) Quote(identifier string) string
- func (m *MSSQLDialect) RenameColumn(table, oldName, newName string) string
- func (m *MSSQLDialect) RenameTable(oldName, newName string) string
- func (m *MSSQLDialect) Returning(columns ...string) string
- func (m *MSSQLDialect) SupportsLastInsertID() bool
- func (m *MSSQLDialect) SupportsReturning() bool
- func (m *MSSQLDialect) SupportsTransactionalDDL() bool
- func (m *MSSQLDialect) UpsertSQL(conflictCols, updateCols []string, _ int) string
- type MariaDBDialect
- func (m *MariaDBDialect) AlterTableAlterColumn(table, column, newDataType string) string
- func (m *MariaDBDialect) CreateSequence(name string, start, increment int64) string
- func (m *MariaDBDialect) CreateSystemVersionedTable(table string, columnDefs string) string
- func (m *MariaDBDialect) HistoryBetween(table, from, to string) string
- func (m *MariaDBDialect) HistoryQuery(table string) string
- func (m *MariaDBDialect) JSONExtract(column, path string) string
- func (m *MariaDBDialect) JSONTable(source, path string, columns ...string) string
- func (m *MariaDBDialect) LastInsertIDQuery(table, pkColumn string) string
- func (m *MariaDBDialect) LimitOffset(limit, offset int) string
- func (d *MariaDBDialect) Name() string
- func (m *MariaDBDialect) NextVal(sequenceName string) string
- func (m *MariaDBDialect) RenameColumn(table, oldName, newName string) string
- func (m *MariaDBDialect) Returning(columns ...string) string
- func (m *MariaDBDialect) SupportsLastInsertID() bool
- func (m *MariaDBDialect) SupportsReturning() bool
- func (m *MariaDBDialect) SupportsTransactionalDDL() bool
- func (m *MariaDBDialect) UpsertSQL(conflictCols, updateCols []string, argOffset int) string
- type Middleware
- type ModelMeta
- type MySQLDialect
- func (m *MySQLDialect) AlterTableAddColumn(table, column, dataType string) string
- func (m *MySQLDialect) AlterTableAlterColumn(table, column, newDataType string) string
- func (m *MySQLDialect) AlterTableDropColumn(table, column string) string
- func (m *MySQLDialect) BuildProcedureCall(procedure string, argCount int) string
- func (m *MySQLDialect) BuildRoutineQuery(routine string, argCount int) string
- func (m *MySQLDialect) CurrentTimestamp() string
- func (m *MySQLDialect) JSONExtract(column, path string) string
- func (m *MySQLDialect) LastInsertIDQuery(table, pkColumn string) string
- func (m *MySQLDialect) LimitOffset(limit, offset int) string
- func (d *MySQLDialect) Name() string
- func (m *MySQLDialect) Placeholder(index int) string
- func (m *MySQLDialect) Placeholders(n int) []string
- func (m *MySQLDialect) Quote(identifier string) string
- func (m *MySQLDialect) RenameColumn(table, oldName, newName string) string
- func (m *MySQLDialect) RenameTable(oldName, newName string) string
- func (m *MySQLDialect) Returning(columns ...string) string
- func (m *MySQLDialect) SupportsLastInsertID() bool
- func (m *MySQLDialect) SupportsReturning() bool
- func (m *MySQLDialect) SupportsTransactionalDDL() bool
- func (m *MySQLDialect) UpsertSQL(conflictCols, updateCols []string, _ int) string
- type Option
- type OracleDialect
- func (o *OracleDialect) AlterTableAddColumn(table, column, dataType string) string
- func (o *OracleDialect) AlterTableAlterColumn(table, column, newDataType string) string
- func (o *OracleDialect) AlterTableDropColumn(table, column string) string
- func (o *OracleDialect) BuildProcedureCall(procedure string, argCount int) string
- func (o *OracleDialect) BuildRoutineQuery(routine string, argCount int) string
- func (o *OracleDialect) CurrentTimestamp() string
- func (o *OracleDialect) JSONExtract(column, path string) string
- func (o *OracleDialect) LastInsertIDQuery(table, pkColumn string) string
- func (o *OracleDialect) LimitOffset(limit, offset int) string
- func (d *OracleDialect) Name() string
- func (o *OracleDialect) Placeholder(index int) string
- func (o *OracleDialect) Placeholders(n int) []string
- func (o *OracleDialect) Quote(identifier string) string
- func (o *OracleDialect) RenameColumn(table, oldName, newName string) string
- func (o *OracleDialect) RenameTable(oldName, newName string) string
- func (o *OracleDialect) Returning(columns ...string) string
- func (o *OracleDialect) SupportsLastInsertID() bool
- func (o *OracleDialect) SupportsReturning() bool
- func (o *OracleDialect) SupportsTransactionalDDL() bool
- func (o *OracleDialect) UpsertSQL(conflictCols, updateCols []string, _ int) string
- type Page
- type PostgresDialect
- func (p *PostgresDialect) AlterTableAddColumn(table, column, dataType string) string
- func (p *PostgresDialect) AlterTableAlterColumn(table, column, newDataType string) string
- func (p *PostgresDialect) AlterTableDropColumn(table, column string) string
- func (p *PostgresDialect) BuildProcedureCall(procedure string, argCount int) string
- func (p *PostgresDialect) BuildRoutineQuery(routine string, argCount int) string
- func (p *PostgresDialect) CurrentTimestamp() string
- func (p *PostgresDialect) JSONExtract(column, path string) string
- func (p *PostgresDialect) LastInsertIDQuery(table, pkColumn string) string
- func (p *PostgresDialect) LimitOffset(limit, offset int) string
- func (d *PostgresDialect) Name() string
- func (p *PostgresDialect) Placeholder(index int) string
- func (p *PostgresDialect) Placeholders(n int) []string
- func (p *PostgresDialect) Quote(identifier string) string
- func (p *PostgresDialect) RenameColumn(table, oldName, newName string) string
- func (p *PostgresDialect) RenameTable(oldName, newName string) string
- func (p *PostgresDialect) Returning(columns ...string) string
- func (p *PostgresDialect) SupportsLastInsertID() bool
- func (p *PostgresDialect) SupportsReturning() bool
- func (p *PostgresDialect) SupportsTransactionalDDL() bool
- func (p *PostgresDialect) UpsertSQL(conflictCols, updateCols []string, _ int) string
- type Query
- func (q *Query[T]) Apply(scopes ...Scope[T]) *Query[T]
- func (q *Query[T]) Avg(column string) (float64, error)
- func (q *Query[T]) Cache(ttl time.Duration, tags ...string) *Query[T]
- func (q *Query[T]) Count() (int64, error)
- func (q *Query[T]) Create(entity *T) error
- func (q *Query[T]) CreateBatch(entities []*T) error
- func (q *Query[T]) Cursor() (*Cursor[T], error)
- func (q *Query[T]) Delete(entity *T) (int64, error)
- func (q *Query[T]) DeleteBatch(ids []any) (int64, error)
- func (q *Query[T]) DeleteBy() (int64, error)
- func (q *Query[T]) Distinct() *Query[T]
- func (q *Query[T]) Find(id any) (T, error)
- func (q *Query[T]) First() (T, error)
- func (q *Query[T]) GroupBy(columns ...string) *Query[T]
- func (q *Query[T]) HardDelete(entity *T) (int64, error)
- func (q *Query[T]) Having(column string, operator string, value any) *Query[T]
- func (q *Query[T]) Iter(fn func(T) error) error
- func (q *Query[T]) Join(table, on string) *Query[T]
- func (q *Query[T]) LeftJoin(table, on string) *Query[T]
- func (q *Query[T]) Limit(n int) *Query[T]
- func (q *Query[T]) List() ([]T, error)
- func (q *Query[T]) Max(column string) (float64, error)
- func (q *Query[T]) Min(column string) (float64, error)
- func (q *Query[T]) Offset(n int) *Query[T]
- func (q *Query[T]) Or(fn func(*Query[T]) *Query[T]) *Query[T]
- func (q *Query[T]) OrderBy(column string, direction string) *Query[T]
- func (q *Query[T]) Paginate(pageSize, page int) (*Page[T], error)
- func (q *Query[T]) Preload(relations ...string) *Query[T]
- func (q *Query[T]) RightJoin(table, on string) *Query[T]
- func (q *Query[T]) Select(columns ...string) *Query[T]
- func (q *Query[T]) Sum(column string) (float64, error)
- func (q *Query[T]) Unscoped() *Query[T]
- func (q *Query[T]) Update(entity *T) (int64, error)
- func (q *Query[T]) UpdateBatch(entities []*T) error
- func (q *Query[T]) UpdateMap(data map[string]any) (int64, error)
- func (q *Query[T]) Upsert(entity *T, conflictCols []string, updateCols []string) error
- func (q *Query[T]) UpsertBatch(entities []*T, conflictCols []string, updateCols []string) error
- func (q *Query[T]) Where(column string, operator string, value any) *Query[T]
- func (q *Query[T]) WhereBetween(column string, start, end any) *Query[T]
- func (q *Query[T]) WhereIn(column string, values []any) *Query[T]
- func (q *Query[T]) WhereJSON(column, path, operator string, value any) *Query[T]
- func (q *Query[T]) WhereNot(column string, operator string, value any) *Query[T]
- func (q *Query[T]) WhereSubquery(column, operator, subquery string) *Query[T]
- type QueryEvent
- type QueryFunc
- type QueryObserver
- type QueryRowFunc
- type RelationMeta
- type Routine
- type SQLGuard
- type SQLiteDialect
- func (s *SQLiteDialect) AlterTableAddColumn(table, column, dataType string) string
- func (s *SQLiteDialect) AlterTableAlterColumn(table, column, newDataType string) string
- func (s *SQLiteDialect) AlterTableDropColumn(table, column string) string
- func (s *SQLiteDialect) BuildProcedureCall(procedure string, argCount int) string
- func (s *SQLiteDialect) BuildRoutineQuery(routine string, argCount int) string
- func (s *SQLiteDialect) CurrentTimestamp() string
- func (s *SQLiteDialect) JSONExtract(column, path string) string
- func (s *SQLiteDialect) LastInsertIDQuery(table, pkColumn string) string
- func (s *SQLiteDialect) LimitOffset(limit, offset int) string
- func (d *SQLiteDialect) Name() string
- func (s *SQLiteDialect) Placeholder(index int) string
- func (s *SQLiteDialect) Placeholders(n int) []string
- func (s *SQLiteDialect) Quote(identifier string) string
- func (s *SQLiteDialect) RenameColumn(table, oldName, newName string) string
- func (s *SQLiteDialect) RenameTable(oldName, newName string) string
- func (s *SQLiteDialect) Returning(columns ...string) string
- func (s *SQLiteDialect) SupportsLastInsertID() bool
- func (s *SQLiteDialect) SupportsReturning() bool
- func (s *SQLiteDialect) SupportsTransactionalDDL() bool
- func (s *SQLiteDialect) UpsertSQL(conflictCols, updateCols []string, _ int) string
- type Scope
- type SyncOptions
- type TenantConfig
- type TenantRouter
- type TenantStrategy
- type Tx
Constants ΒΆ
This section is empty.
Variables ΒΆ
var ( // ErrNotFound indicates that no record was found for the given criteria. ErrNotFound = errors.New("record not found") // ErrInvalidModel indicates that the provided model is invalid or not registered. ErrInvalidModel = errors.New("invalid model") // ErrInvalidQuery indicates that the query is malformed or invalid. ErrInvalidQuery = errors.New("invalid query") // ErrInvalidIdentifier indicates that a table or column identifier is invalid. ErrInvalidIdentifier = errors.New("invalid identifier") // ErrDialectNotSupported indicates that the database dialect is not supported. ErrDialectNotSupported = errors.New("dialect not supported") // ErrConnection indicates a database connection error. ErrConnection = errors.New("database connection error") // ErrTimeout indicates that a query timed out. ErrTimeout = errors.New("query timeout") // ErrConstraintViolation indicates a database constraint violation. ErrConstraintViolation = errors.New("constraint violation") )
Common errors returned by quark operations.
var HasPlaceholders = guard.HasPlaceholders
HasPlaceholders checks if a query string contains parameter placeholders.
Functions ΒΆ
func Call ΒΆ
Call executes a stored procedure that does not return a result set, but may modify OUT parameters.
func Notify ΒΆ
func Notify(ctx context.Context, provider ClientProvider, channel, payload string) error
Notify is a helper to trigger a database event (e.g., NOTIFY in Postgres).
func RegisterDialect ΒΆ
RegisterDialect allows developers to register custom database dialects. This enables support for proprietary or non-standard databases.
Example:
quark.RegisterDialect("cockroach", myCockroachDialect)
The registered dialect can then be used with:
client, err := quark.New(db, quark.WithDialect(quark.DetectDialectByName("cockroach")))
Types ΒΆ
type AfterCreateHook ΒΆ
AfterCreateHook is executed after an entity is created.
type AfterDeleteHook ΒΆ
AfterDeleteHook is executed after an entity is deleted.
type AfterUpdateHook ΒΆ
AfterUpdateHook is executed after an entity is updated.
type BaseMiddleware ΒΆ
type BaseMiddleware struct{}
BaseMiddleware provides default implementations that pass through to the next handler. Embed this in your middleware so you only need to override the methods you care about.
func (BaseMiddleware) WrapExec ΒΆ
func (BaseMiddleware) WrapExec(next ExecFunc) ExecFunc
func (BaseMiddleware) WrapQuery ΒΆ
func (BaseMiddleware) WrapQuery(next QueryFunc) QueryFunc
func (BaseMiddleware) WrapQueryRow ΒΆ
func (BaseMiddleware) WrapQueryRow(next QueryRowFunc) QueryRowFunc
type BaseQuery ΒΆ
type BaseQuery struct {
// contains filtered or unexported fields
}
BaseQuery holds the non-generic state of a database query.
type BeforeCreateHook ΒΆ
BeforeCreateHook is executed before an entity is created.
type BeforeDeleteHook ΒΆ
BeforeDeleteHook is executed before an entity is deleted.
type BeforeUpdateHook ΒΆ
BeforeUpdateHook is executed before an entity is updated.
type CacheConfig ΒΆ
CacheConfig holds the caching parameters for a specific query.
type CacheStore ΒΆ
type CacheStore interface {
// Get retrieves a value from the cache.
Get(ctx context.Context, key string) ([]byte, error)
// Set stores a value in the cache with a specific TTL and associated tags.
Set(ctx context.Context, key string, val []byte, ttl time.Duration, tags ...string) error
// Delete removes a specific key.
Delete(ctx context.Context, key string) error
// InvalidateTags removes all entries associated with the given tags (usually table names).
InvalidateTags(ctx context.Context, tags ...string) error
}
CacheStore defines the contract for any caching backend. Implementations should be provided in separate packages (e.g., quark/cache/redis).
type Client ΒΆ
type Client struct {
// contains filtered or unexported fields
}
Client is the main entry point for quark ORM operations. It wraps a database connection and provides type-safe query building.
func New ΒΆ
New creates a new quark Client with the given database connection and options.
Example:
db, err := sql.Open("postgres", "postgres://user:pass@localhost/db")
if err != nil {
log.Fatal(err)
}
client, err := quark.New(db,
quark.WithDialect(quark.PostgreSQL()),
quark.WithLogger(slog.Default()),
)
func (*Client) AddForeignKey ΒΆ
func (c *Client) AddForeignKey(ctx context.Context, table, constraintName string, columns []string, refTable string, refColumns []string, onDelete, onUpdate string) error
AddForeignKey adds a FOREIGN KEY constraint to an existing table. constraintName is the constraint identifier; refTable is the referenced table; columns and refColumns are matched by position.
Example:
client.AddForeignKey(ctx, "orders", "fk_orders_user", []string{"user_id"}, "users", []string{"id"}, "CASCADE", "SET NULL")
func (*Client) BeginTx ΒΆ
BeginTx starts a new database transaction with the given options.
Example:
tx, err := client.BeginTx(ctx, nil)
if err != nil { log.Fatal(err) }
defer tx.Rollback()
quark.ForTx[User](ctx, tx).Create(&user)
tx.Commit()
func (*Client) CreateIndex ΒΆ
func (c *Client) CreateIndex(ctx context.Context, table, indexName string, columns []string, unique bool) error
CreateIndex creates an index on the given table and columns. If unique is true, a UNIQUE INDEX is created. If the index already exists the error is silently ignored for compatible dialects.
Example:
client.CreateIndex(ctx, "users", "idx_users_email", []string{"email"}, true)
func (*Client) Exec ΒΆ
Exec executes a raw SQL statement (INSERT, UPDATE, DELETE, DDL). This is primarily used for migrations and schema changes.
func (*Client) Migrate ΒΆ
Migrate creates tables for the given models if they don't exist. This is a simplistic auto-migration tool for development. It uses the "db" and "pk" tags to generate CREATE TABLE statements. It also creates join tables for many-to-many relations.
func (*Client) Raw ΒΆ
Raw returns the underlying *sql.DB for advanced operations. Use with caution - this bypasses quark's safety features.
func (*Client) RawQuery ΒΆ
RawQuery executes a raw SQL query with the given arguments. By default, this requires placeholders to prevent SQL injection. Enable with WithLimits(Limits{AllowRawQueries: true}).
func (*Client) Sync ΒΆ
Sync synchronizes the database schema with the provided models. It detects missing columns, renames, and can drop columns if safe mode is disabled.
func (*Client) Tx ΒΆ
Tx executes fn within a transaction. If fn returns nil, the transaction is committed. If fn returns an error or panics, the transaction is rolled back.
Example:
err := client.Tx(ctx, func(tx *quark.Tx) error {
quark.ForTx[User](ctx, tx).Create(&user)
quark.ForTx[Order](ctx, tx).Create(&order)
return nil // auto-commit
})
type ClientProvider ΒΆ
ClientProvider is an interface that provides a database client. Both *Client and *TenantRouter implement this.
type Cursor ΒΆ
type Cursor[T any] struct { // contains filtered or unexported fields }
Cursor provides manual iteration over query results. Similar to sql.Rows but type-safe for model T.
type Dialect ΒΆ
type Dialect interface {
// Name returns the dialect name (e.g., "postgres", "mysql", "sqlite").
Name() string
// Placeholder returns the placeholder for the given parameter index.
// PostgreSQL: $1, $2, etc.
// MySQL/SQLite: ?
// MSSQL: @p1, @p2, etc.
// Oracle: :1, :2, etc.
Placeholder(index int) string
// Quote returns a quoted identifier (table/column name).
// PostgreSQL: "identifier"
// MySQL: `identifier`
// MSSQL: [identifier]
// SQLite/Oracle: "identifier"
Quote(identifier string) string
// Placeholders returns a slice of placeholders for n parameters.
Placeholders(n int) []string
// LimitOffset returns the LIMIT/OFFSET clause for the given parameters.
LimitOffset(limit, offset int) string
// SupportsReturning indicates if the dialect supports RETURNING clause.
SupportsReturning() bool
// Returning returns the RETURNING clause for the given columns.
// Returns empty string if not supported.
Returning(columns ...string) string
// SupportsLastInsertID indicates if the dialect supports LastInsertId().
SupportsLastInsertID() bool
// LastInsertIDQuery returns the query to get the last insert ID.
// Used for dialects that don't support RETURNING.
LastInsertIDQuery(table, pkColumn string) string
// CurrentTimestamp returns the SQL function for current timestamp.
CurrentTimestamp() string
// BuildRoutineQuery returns the SQL for a table-valued function or routine returning rows.
// E.g., Postgres: SELECT * FROM func($1, $2)
BuildRoutineQuery(routine string, argCount int) string
// BuildProcedureCall returns the SQL for calling a procedure (pure logic / OUT params).
// E.g., MySQL: CALL proc(?, ?)
BuildProcedureCall(procedure string, argCount int) string
// JSONExtract returns the SQL expression to extract a value from a JSON column.
// E.g., Postgres: "data"->>'key'
// MySQL: JSON_EXTRACT(`data`, '$.key')
JSONExtract(column, path string) string
// AlterTableAddColumn returns SQL to add a column to a table.
// E.g., PostgreSQL: ALTER TABLE "users" ADD COLUMN "email" VARCHAR(255)
AlterTableAddColumn(table, column, dataType string) string
// AlterTableDropColumn returns SQL to drop a column from a table.
// E.g., PostgreSQL: ALTER TABLE "users" DROP COLUMN "email"
AlterTableDropColumn(table, column string) string
// AlterTableAlterColumn returns SQL to alter a column's type.
// E.g., PostgreSQL: ALTER TABLE "users" ALTER COLUMN "email" TYPE VARCHAR(255)
AlterTableAlterColumn(table, column, newDataType string) string
// RenameColumn returns SQL to rename a column.
// E.g., PostgreSQL: ALTER TABLE "users" RENAME COLUMN "old_name" TO "new_name"
RenameColumn(table, oldName, newName string) string
// RenameTable returns SQL to rename a table.
// E.g., PostgreSQL: ALTER TABLE "users" RENAME TO "accounts"
RenameTable(oldName, newName string) string
// SupportsTransactionalDDL indicates if the dialect supports DDL in transactions.
SupportsTransactionalDDL() bool
// UpsertSQL returns the dialect-specific upsert (INSERT β¦ ON CONFLICT β¦ DO UPDATE)
// fragment that is appended after the VALUES clause.
// conflictCols: columns that define the conflict target (e.g. primary key or unique index).
// updateCols: columns to update on conflict; if empty defaults to all non-conflict columns.
// argOffset: current placeholder index (1-based) so positional dialects stay in sync.
// Returns the SQL fragment and the additional argument list (for the SET clause values).
UpsertSQL(conflictCols, updateCols []string, argOffset int) string
}
Dialect defines the interface for database-specific SQL generation. Each supported database (PostgreSQL, MySQL, SQLite, etc.) implements this interface.
func DetectDialect ΒΆ
DetectDialect attempts to auto-detect the dialect from a driver name.
func DetectDialectByName ΒΆ
DetectDialectByName attempts to get a dialect by name from all registered dialects including custom ones. This is useful when you know the exact dialect name.
type EventBus ΒΆ
type EventBus struct {
// contains filtered or unexported fields
}
EventBus provides a dialect-agnostic factory for creating EventListeners. Since not all databases support PubSub natively (e.g., SQLite), this may return ErrNotSupported for certain dialects.
func NewEventBus ΒΆ
NewEventBus creates a new EventBus for the given client.
func (*EventBus) CreateListener ΒΆ
func (eb *EventBus) CreateListener() (EventListener, error)
CreateListener creates an EventListener based on the dialect.
NOTE: EventBus is experimental in V1. Native LISTEN/NOTIFY (PostgreSQL) requires a dedicated connection with a driver-specific implementation (e.g., github.com/lib/pq). This will be completed in a future release.
type EventListener ΒΆ
type EventListener interface {
// Listen subscribes to a specific channel.
Listen(ctx context.Context, channel string) error
// Unlisten unsubscribes from a channel.
Unlisten(ctx context.Context, channel string) error
// Receive blocks until an event is received, returning the payload or an error.
Receive(ctx context.Context) (EventPayload, error)
// Close terminates the listener connection.
Close() error
}
EventListener defines an interface for listening to database events. This is typically implemented via PubSub mechanisms like PostgreSQL's LISTEN/NOTIFY.
type EventPayload ΒΆ
EventPayload represents a message received from a database event channel.
type ExecFunc ΒΆ
type ExecFunc func(ctx context.Context, exec Executor, sqlStr string, args []any) (sql.Result, error)
ExecFunc is the signature for SQL execution functions used by middleware.
type Executor ΒΆ
type Executor interface {
QueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error)
QueryRowContext(ctx context.Context, query string, args ...any) *sql.Row
ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
}
Executor is the common interface for *sql.DB and *sql.Tx. It allows Query[T] to execute against either a raw connection or a transaction.
type Limits ΒΆ
type Limits struct {
MaxQueryLength int
MaxResults int
MaxJoins int
MaxWhereConditions int
QueryTimeout time.Duration
AllowRawQueries bool
SafeMigrations bool
}
Limits defines security and performance limits for queries.
type MSSQLDialect ΒΆ
type MSSQLDialect struct {
// contains filtered or unexported fields
}
MSSQLDialect implements the Microsoft SQL Server dialect.
func (*MSSQLDialect) AlterTableAddColumn ΒΆ
func (m *MSSQLDialect) AlterTableAddColumn(table, column, dataType string) string
func (*MSSQLDialect) AlterTableAlterColumn ΒΆ
func (m *MSSQLDialect) AlterTableAlterColumn(table, column, newDataType string) string
func (*MSSQLDialect) AlterTableDropColumn ΒΆ
func (m *MSSQLDialect) AlterTableDropColumn(table, column string) string
func (*MSSQLDialect) BuildProcedureCall ΒΆ
func (m *MSSQLDialect) BuildProcedureCall(procedure string, argCount int) string
func (*MSSQLDialect) BuildRoutineQuery ΒΆ
func (m *MSSQLDialect) BuildRoutineQuery(routine string, argCount int) string
func (*MSSQLDialect) CurrentTimestamp ΒΆ
func (m *MSSQLDialect) CurrentTimestamp() string
func (*MSSQLDialect) JSONExtract ΒΆ
func (m *MSSQLDialect) JSONExtract(column, path string) string
func (*MSSQLDialect) LastInsertIDQuery ΒΆ
func (m *MSSQLDialect) LastInsertIDQuery(table, pkColumn string) string
func (*MSSQLDialect) LimitOffset ΒΆ
func (m *MSSQLDialect) LimitOffset(limit, offset int) string
func (*MSSQLDialect) Placeholder ΒΆ
func (m *MSSQLDialect) Placeholder(index int) string
func (*MSSQLDialect) Placeholders ΒΆ
func (m *MSSQLDialect) Placeholders(n int) []string
func (*MSSQLDialect) Quote ΒΆ
func (m *MSSQLDialect) Quote(identifier string) string
func (*MSSQLDialect) RenameColumn ΒΆ
func (m *MSSQLDialect) RenameColumn(table, oldName, newName string) string
func (*MSSQLDialect) RenameTable ΒΆ
func (m *MSSQLDialect) RenameTable(oldName, newName string) string
func (*MSSQLDialect) Returning ΒΆ
func (m *MSSQLDialect) Returning(columns ...string) string
func (*MSSQLDialect) SupportsLastInsertID ΒΆ
func (m *MSSQLDialect) SupportsLastInsertID() bool
func (*MSSQLDialect) SupportsReturning ΒΆ
func (m *MSSQLDialect) SupportsReturning() bool
func (*MSSQLDialect) SupportsTransactionalDDL ΒΆ
func (m *MSSQLDialect) SupportsTransactionalDDL() bool
func (*MSSQLDialect) UpsertSQL ΒΆ
func (m *MSSQLDialect) UpsertSQL(conflictCols, updateCols []string, _ int) string
UpsertSQL for MSSQL: uses MERGE statement appended as a WITH-style hint. MSSQL requires MERGE syntax which cannot be appended to a plain INSERT, so we return a marker that buildUpsert handles specially.
type MariaDBDialect ΒΆ
type MariaDBDialect struct {
MySQLDialect // embed MySQL β identical wire protocol and driver
}
MariaDBDialect implements the MariaDB dialect. MariaDB is a fork of MySQL with significant additions:
- RETURNING clause in INSERT/DELETE/UPDATE (10.5+)
- Native sequences via CREATE SEQUENCE (10.3+)
- Temporal tables / system-versioned tables (10.3.4+)
- JSON_TABLE support (10.6+)
- INTERSECT / EXCEPT set operations (10.3+)
- Descending indexes (10.6+)
- UUID() and UUID_SHORT() built-ins
- IGNORE INDEX / USE INDEX hints identical to MySQL
func (*MariaDBDialect) AlterTableAlterColumn ΒΆ
func (m *MariaDBDialect) AlterTableAlterColumn(table, column, newDataType string) string
AlterTableAlterColumn uses MODIFY COLUMN (same as MySQL).
func (*MariaDBDialect) CreateSequence ΒΆ
func (m *MariaDBDialect) CreateSequence(name string, start, increment int64) string
CreateSequence returns the DDL to create a named sequence (MariaDB 10.3+).
func (*MariaDBDialect) CreateSystemVersionedTable ΒΆ
func (m *MariaDBDialect) CreateSystemVersionedTable(table string, columnDefs string) string
CreateSystemVersionedTable returns the DDL for a system-versioned (temporal) table. Requires MariaDB 10.3.4+.
func (*MariaDBDialect) HistoryBetween ΒΆ
func (m *MariaDBDialect) HistoryBetween(table, from, to string) string
HistoryBetween returns SELECT β¦ FOR SYSTEM_TIME BETWEEN for a time range.
func (*MariaDBDialect) HistoryQuery ΒΆ
func (m *MariaDBDialect) HistoryQuery(table string) string
HistoryQuery returns SELECT β¦ FOR SYSTEM_TIME ALL to query full row history.
func (*MariaDBDialect) JSONExtract ΒΆ
func (m *MariaDBDialect) JSONExtract(column, path string) string
JSONExtract uses the MariaDB / MySQL JSON_VALUE syntax (10.2.3+). MariaDB also accepts the arrow operator col->>'$.key' from 10.4.3+.
func (*MariaDBDialect) JSONTable ΒΆ
func (m *MariaDBDialect) JSONTable(source, path string, columns ...string) string
JSONTable returns a JSON_TABLE expression (MariaDB 10.6+). source: SQL expression producing JSON; path: root path e.g. '$[*]'; columns: column definitions e.g. "id INT PATH '$.id'"
func (*MariaDBDialect) LastInsertIDQuery ΒΆ
func (m *MariaDBDialect) LastInsertIDQuery(table, pkColumn string) string
LastInsertIDQuery is kept as fallback for engines older than 10.5.
func (*MariaDBDialect) LimitOffset ΒΆ
func (m *MariaDBDialect) LimitOffset(limit, offset int) string
LimitOffset for MariaDB uses standard LIMIT β¦ OFFSET β¦ syntax (unlike MySQL which uses LIMIT offset, count).
func (*MariaDBDialect) NextVal ΒΆ
func (m *MariaDBDialect) NextVal(sequenceName string) string
NextVal returns the SQL expression that reads the next value from a sequence.
func (*MariaDBDialect) RenameColumn ΒΆ
func (m *MariaDBDialect) RenameColumn(table, oldName, newName string) string
RenameColumn uses the standard SQL syntax supported since MariaDB 10.4.2.
func (*MariaDBDialect) Returning ΒΆ
func (m *MariaDBDialect) Returning(columns ...string) string
Returning generates a RETURNING clause compatible with MariaDB 10.5+.
func (*MariaDBDialect) SupportsLastInsertID ΒΆ
func (m *MariaDBDialect) SupportsLastInsertID() bool
SupportsLastInsertID returns false when RETURNING is used. The ORM prefers RETURNING over LAST_INSERT_ID() for MariaDB.
func (*MariaDBDialect) SupportsReturning ΒΆ
func (m *MariaDBDialect) SupportsReturning() bool
SupportsReturning returns true: MariaDB 10.5+ supports RETURNING in INSERT β¦ RETURNING, DELETE β¦ RETURNING and UPDATE β¦ RETURNING.
func (*MariaDBDialect) SupportsTransactionalDDL ΒΆ
func (m *MariaDBDialect) SupportsTransactionalDDL() bool
SupportsTransactionalDDL returns false β MariaDB (like MySQL) performs implicit commits around DDL statements.
type Middleware ΒΆ
type Middleware interface {
WrapExec(next ExecFunc) ExecFunc
WrapQuery(next QueryFunc) QueryFunc
WrapQueryRow(next QueryRowFunc) QueryRowFunc
}
Middleware wraps query execution for cross-cutting concerns like logging, retry logic, caching, rate limiting, etc. It intercepts all types of database interactions (Exec, Query, QueryRow).
type ModelMeta ΒΆ
ModelMeta is the cached metadata for a model struct.
func GetModelMeta ΒΆ
GetModelMeta returns the cached metadata for model type T.
func GetModelMetaByType ΒΆ
GetModelMetaByType returns the cached metadata for a reflect.Type.
type MySQLDialect ΒΆ
type MySQLDialect struct {
// contains filtered or unexported fields
}
MySQLDialect implements the MySQL dialect.
func (*MySQLDialect) AlterTableAddColumn ΒΆ
func (m *MySQLDialect) AlterTableAddColumn(table, column, dataType string) string
func (*MySQLDialect) AlterTableAlterColumn ΒΆ
func (m *MySQLDialect) AlterTableAlterColumn(table, column, newDataType string) string
func (*MySQLDialect) AlterTableDropColumn ΒΆ
func (m *MySQLDialect) AlterTableDropColumn(table, column string) string
func (*MySQLDialect) BuildProcedureCall ΒΆ
func (m *MySQLDialect) BuildProcedureCall(procedure string, argCount int) string
func (*MySQLDialect) BuildRoutineQuery ΒΆ
func (m *MySQLDialect) BuildRoutineQuery(routine string, argCount int) string
func (*MySQLDialect) CurrentTimestamp ΒΆ
func (m *MySQLDialect) CurrentTimestamp() string
func (*MySQLDialect) JSONExtract ΒΆ
func (m *MySQLDialect) JSONExtract(column, path string) string
func (*MySQLDialect) LastInsertIDQuery ΒΆ
func (m *MySQLDialect) LastInsertIDQuery(table, pkColumn string) string
func (*MySQLDialect) LimitOffset ΒΆ
func (m *MySQLDialect) LimitOffset(limit, offset int) string
func (*MySQLDialect) Placeholder ΒΆ
func (m *MySQLDialect) Placeholder(index int) string
func (*MySQLDialect) Placeholders ΒΆ
func (m *MySQLDialect) Placeholders(n int) []string
func (*MySQLDialect) Quote ΒΆ
func (m *MySQLDialect) Quote(identifier string) string
func (*MySQLDialect) RenameColumn ΒΆ
func (m *MySQLDialect) RenameColumn(table, oldName, newName string) string
func (*MySQLDialect) RenameTable ΒΆ
func (m *MySQLDialect) RenameTable(oldName, newName string) string
func (*MySQLDialect) Returning ΒΆ
func (m *MySQLDialect) Returning(columns ...string) string
func (*MySQLDialect) SupportsLastInsertID ΒΆ
func (m *MySQLDialect) SupportsLastInsertID() bool
func (*MySQLDialect) SupportsReturning ΒΆ
func (m *MySQLDialect) SupportsReturning() bool
func (*MySQLDialect) SupportsTransactionalDDL ΒΆ
func (m *MySQLDialect) SupportsTransactionalDDL() bool
type Option ΒΆ
type Option func(*Client)
Option configures a Client.
func WithCacheStore ΒΆ
func WithCacheStore(s CacheStore) Option
WithCacheStore sets the caching backend for the client.
func WithDialect ΒΆ
WithDialect sets the SQL dialect for the client. If not set, the dialect will be auto-detected from the database driver.
func WithLimits ΒΆ
WithLimits sets the security and performance limits.
func WithLogger ΒΆ
WithLogger sets the logger for the client. If not set, a no-op logger will be used.
func WithMiddleware ΒΆ
func WithMiddleware(m Middleware) Option
WithMiddleware adds middleware to the query execution chain. Middleware is applied in the order they are added.
func WithQueryObserver ΒΆ
func WithQueryObserver(o QueryObserver) Option
WithQueryObserver adds a query observer to the client. Multiple observers can be added and will be called in order.
type OracleDialect ΒΆ
type OracleDialect struct {
// contains filtered or unexported fields
}
OracleDialect implements the Oracle Database dialect.
func (*OracleDialect) AlterTableAddColumn ΒΆ
func (o *OracleDialect) AlterTableAddColumn(table, column, dataType string) string
func (*OracleDialect) AlterTableAlterColumn ΒΆ
func (o *OracleDialect) AlterTableAlterColumn(table, column, newDataType string) string
func (*OracleDialect) AlterTableDropColumn ΒΆ
func (o *OracleDialect) AlterTableDropColumn(table, column string) string
func (*OracleDialect) BuildProcedureCall ΒΆ
func (o *OracleDialect) BuildProcedureCall(procedure string, argCount int) string
func (*OracleDialect) BuildRoutineQuery ΒΆ
func (o *OracleDialect) BuildRoutineQuery(routine string, argCount int) string
func (*OracleDialect) CurrentTimestamp ΒΆ
func (o *OracleDialect) CurrentTimestamp() string
func (*OracleDialect) JSONExtract ΒΆ
func (o *OracleDialect) JSONExtract(column, path string) string
func (*OracleDialect) LastInsertIDQuery ΒΆ
func (o *OracleDialect) LastInsertIDQuery(table, pkColumn string) string
func (*OracleDialect) LimitOffset ΒΆ
func (o *OracleDialect) LimitOffset(limit, offset int) string
func (*OracleDialect) Placeholder ΒΆ
func (o *OracleDialect) Placeholder(index int) string
func (*OracleDialect) Placeholders ΒΆ
func (o *OracleDialect) Placeholders(n int) []string
func (*OracleDialect) Quote ΒΆ
func (o *OracleDialect) Quote(identifier string) string
func (*OracleDialect) RenameColumn ΒΆ
func (o *OracleDialect) RenameColumn(table, oldName, newName string) string
func (*OracleDialect) RenameTable ΒΆ
func (o *OracleDialect) RenameTable(oldName, newName string) string
func (*OracleDialect) Returning ΒΆ
func (o *OracleDialect) Returning(columns ...string) string
func (*OracleDialect) SupportsLastInsertID ΒΆ
func (o *OracleDialect) SupportsLastInsertID() bool
func (*OracleDialect) SupportsReturning ΒΆ
func (o *OracleDialect) SupportsReturning() bool
func (*OracleDialect) SupportsTransactionalDDL ΒΆ
func (o *OracleDialect) SupportsTransactionalDDL() bool
type Page ΒΆ
type Page[T any] struct { Items []T // The items for current page Total int64 // Total count (if available) Page int // Current page number (0-indexed) PageSize int // Items per page TotalPages int64 // Calculated total pages }
Page represents a paginated result set.
type PostgresDialect ΒΆ
type PostgresDialect struct {
// contains filtered or unexported fields
}
PostgresDialect implements the PostgreSQL dialect.
func (*PostgresDialect) AlterTableAddColumn ΒΆ
func (p *PostgresDialect) AlterTableAddColumn(table, column, dataType string) string
func (*PostgresDialect) AlterTableAlterColumn ΒΆ
func (p *PostgresDialect) AlterTableAlterColumn(table, column, newDataType string) string
func (*PostgresDialect) AlterTableDropColumn ΒΆ
func (p *PostgresDialect) AlterTableDropColumn(table, column string) string
func (*PostgresDialect) BuildProcedureCall ΒΆ
func (p *PostgresDialect) BuildProcedureCall(procedure string, argCount int) string
func (*PostgresDialect) BuildRoutineQuery ΒΆ
func (p *PostgresDialect) BuildRoutineQuery(routine string, argCount int) string
func (*PostgresDialect) CurrentTimestamp ΒΆ
func (p *PostgresDialect) CurrentTimestamp() string
func (*PostgresDialect) JSONExtract ΒΆ
func (p *PostgresDialect) JSONExtract(column, path string) string
func (*PostgresDialect) LastInsertIDQuery ΒΆ
func (p *PostgresDialect) LastInsertIDQuery(table, pkColumn string) string
func (*PostgresDialect) LimitOffset ΒΆ
func (p *PostgresDialect) LimitOffset(limit, offset int) string
func (*PostgresDialect) Placeholder ΒΆ
func (p *PostgresDialect) Placeholder(index int) string
func (*PostgresDialect) Placeholders ΒΆ
func (p *PostgresDialect) Placeholders(n int) []string
func (*PostgresDialect) Quote ΒΆ
func (p *PostgresDialect) Quote(identifier string) string
func (*PostgresDialect) RenameColumn ΒΆ
func (p *PostgresDialect) RenameColumn(table, oldName, newName string) string
func (*PostgresDialect) RenameTable ΒΆ
func (p *PostgresDialect) RenameTable(oldName, newName string) string
func (*PostgresDialect) Returning ΒΆ
func (p *PostgresDialect) Returning(columns ...string) string
func (*PostgresDialect) SupportsLastInsertID ΒΆ
func (p *PostgresDialect) SupportsLastInsertID() bool
func (*PostgresDialect) SupportsReturning ΒΆ
func (p *PostgresDialect) SupportsReturning() bool
func (*PostgresDialect) SupportsTransactionalDDL ΒΆ
func (p *PostgresDialect) SupportsTransactionalDDL() bool
type Query ΒΆ
Query represents a type-safe database query builder for model T. All builder methods return a new Query (immutable/clone pattern) for thread-safety. Execution methods are in query_exec.go and query_crud.go
func For ΒΆ
func For[T any](ctx context.Context, provider ClientProvider) *Query[T]
For creates a Query builder for the given model type. This is the primary entry point for type-safe database operations.
Example:
type User struct {
ID int64 `db:"id"`
Name string `db:"name"`
}
user, err := quark.For[User](ctx, client).Find(1)
users, err := quark.For[User](ctx, client).Where("active", "=", true).List()
func ForTx ΒΆ
ForTx creates a Query builder for the given model type bound to a transaction. This is the transactional counterpart of For[T]().
Example:
err := client.Tx(ctx, func(tx *quark.Tx) error {
return quark.ForTx[User](ctx, tx).Create(&user)
})
func (*Query[T]) Apply ΒΆ
Apply applies one or more Scope functions to the query. Scopes are composable, reusable query fragments.
Example:
activeUsers := func(q *quark.Query[User]) *quark.Query[User] {
return q.Where("active", "=", true)
}
users, _ := quark.For[User](ctx, client).Apply(activeUsers).List()
func (*Query[T]) Create ΒΆ
Create inserts a new record. The entity must have a db tag on fields to be persisted. Returns with the ID set from the database. Create inserts a new record and recursively saves associations.
func (*Query[T]) CreateBatch ΒΆ
CreateBatch inserts multiple records in a single SQL statement using bulk VALUES. Each entity gets its PK populated when the dialect supports RETURNING; otherwise PKs are left at their zero value (callers can re-query if needed).
Example:
users := []*User{{Name: "Alice"}, {Name: "Bob"}}
err := quark.For[User](ctx, client).CreateBatch(users)
func (*Query[T]) Cursor ΒΆ
Cursor returns a Cursor for manual iteration over large result sets. The Cursor must be closed after use (defer cursor.Close()).
Example:
cursor, err := quark.For[User](ctx, client).Where("active", "=", true).Cursor()
if err != nil { log.Fatal(err) }
defer cursor.Close()
for cursor.Next() {
var user User
if err := cursor.Scan(&user); err != nil { break }
process(user)
}
func (*Query[T]) Delete ΒΆ
Delete performs a soft delete by setting deleted_at = NOW(). If the model doesn't have deleted_at field, performs hard delete. Returns the number of rows affected.
func (*Query[T]) DeleteBatch ΒΆ
DeleteBatch deletes multiple records by their primary key values using DELETE β¦ WHERE pk IN (β¦) statements, chunked to batchChunkSize to stay within every supported dialect's placeholder limit (Oracle: 1000, MSSQL: ~2100, others: larger).
Example:
affected, err := quark.For[User](ctx, client).DeleteBatch([]any{1, 2, 3})
func (*Query[T]) DeleteBy ΒΆ
DeleteBy performs a hard delete with WHERE conditions. Requires Where clause for safety.
func (*Query[T]) HardDelete ΒΆ
HardDelete permanently deletes the entity by its primary key.
func (*Query[T]) Iter ΒΆ
Iter executes the query and iterates over results one by one. Uses streaming to handle large datasets without loading all into memory.
Example:
err := quark.For[User](ctx, client).Where("active", "=", true).Iter(func(user User) error {
process(user)
return nil
})
func (*Query[T]) Join ΒΆ
Join adds an INNER JOIN clause.
Example:
quark.For[Order](ctx, client).
Join("users", "users.id = orders.user_id").
List()
func (*Query[T]) List ΒΆ
List executes the query and returns all matching rows. If Limit() is not called, uses a safe default (100) to prevent OOM. Use Iter() for unbounded streaming or Paginate() for large datasets.
func (*Query[T]) Or ΒΆ
Or adds an OR condition group. The callback receives a fresh Query to build conditions. All conditions within the callback are grouped with AND and joined to the outer query with OR.
Example:
quark.For[User](ctx, client).
Where("active", "=", true).
Or(func(q *Query[User]) *Query[User] {
return q.Where("role", "=", "admin").Where("role", "=", "superadmin")
}).List()
Generates: WHERE "active" = $1 OR ("role" = $2 AND "role" = $3)
func (*Query[T]) Paginate ΒΆ
Paginate executes the query with pagination. Returns current page, total count, and error.
Example:
page, err := quark.For[User](ctx, client).Paginate(100, 0) // 100 per page, page 0
page, err := quark.For[User](ctx, client).Where("active", "=", true).Paginate(50, 2)
func (*Query[T]) Update ΒΆ
Update updates the entity by its primary key. Non-zero fields are updated (partial update). Any Where() conditions are merged into the WHERE clause alongside the PK. Returns the number of rows affected. Update performs a partial update of non-zero fields and recursively saves associations.
func (*Query[T]) UpdateBatch ΒΆ
UpdateBatch updates multiple records by their primary keys within a single transaction. Each entity undergoes a partial update: zero-value fields are skipped (same semantics as Update). A transaction is used to guarantee atomicity across all rows.
Example:
err := quark.For[User](ctx, client).UpdateBatch(users)
func (*Query[T]) UpdateMap ΒΆ
UpdateMap updates fields using a map (for partial updates without full entity). Requires Where clause for safety. Returns the number of rows affected.
func (*Query[T]) Upsert ΒΆ
Upsert inserts or updates a record depending on whether a conflict occurs on conflictCols. updateCols specifies which columns to update on conflict; if empty, all non-conflict columns are updated.
Example:
quark.For[User](ctx, client).Upsert(&user, []string{"email"}, []string{"name", "updated_at"})
func (*Query[T]) UpsertBatch ΒΆ
UpsertBatch inserts or updates multiple records in a single batch operation. conflictCols defines uniqueness (e.g. primary key or unique index columns). updateCols defines which columns to update on conflict; empty = all non-conflict columns.
Dialect strategies:
- Postgres / SQLite / MySQL / MariaDB: multi-row INSERT β¦ ON CONFLICT / ON DUPLICATE KEY
- MSSQL: single MERGE β¦ USING (VALUES β¦) AS src(β¦)
- Oracle: N individual MERGE statements (Oracle IDENTITY restriction prevents bulk MERGE)
Example:
err := quark.For[User](ctx, client).UpsertBatch(users, []string{"email"}, []string{"name"})
func (*Query[T]) WhereBetween ΒΆ
WhereBetween adds a WHERE ... BETWEEN condition.
func (*Query[T]) WhereJSON ΒΆ
WhereJSON adds a WHERE condition for a JSON field. column is the JSON column name, path is the key or path within the JSON object.
func (*Query[T]) WhereNot ΒΆ
WhereNot adds a WHERE NOT condition with AND logic.
Example:
quark.For[User](ctx, client).WhereNot("active", "=", false).List()
Generates: WHERE NOT ("active" = $1)
func (*Query[T]) WhereSubquery ΒΆ
WhereSubquery adds a WHERE column operator (subquery) condition. The subquery is a raw SQL string. Use this only when AllowRawQueries is enabled.
Example:
sub := "SELECT MAX(id) FROM orders WHERE status = 'open'"
quark.For[User](ctx, client).WhereSubquery("id", "IN", sub).List()
type QueryEvent ΒΆ
type QueryEvent struct {
SQL string
Args []any
Duration time.Duration
Rows int64
Error error
Table string
Operation string // "SELECT", "INSERT", "UPDATE", "DELETE"
}
QueryEvent represents a executed query.
type QueryFunc ΒΆ
type QueryFunc func(ctx context.Context, exec Executor, sqlStr string, args []any) (*sql.Rows, error)
QueryFunc is the signature for SQL query functions used by middleware.
type QueryObserver ΒΆ
type QueryObserver interface {
ObserveQuery(event QueryEvent)
}
QueryObserver is called after each query execution. Use this for logging, metrics, auditing, etc.
type QueryRowFunc ΒΆ
QueryRowFunc is the signature for SQL single-row query functions used by middleware.
type RelationMeta ΒΆ
type RelationMeta = schema.RelationMeta
RelationMeta is the metadata for a model relation.
type Routine ΒΆ
type Routine[T any] struct { // contains filtered or unexported fields }
Routine is a builder for executing database functions and stored procedures that return results (table-valued functions or scalar functions).
func NewRoutine ΒΆ
func NewRoutine[T any](ctx context.Context, provider ClientProvider, routine string, args ...any) *Routine[T]
NewRoutine creates a new Routine builder for the given procedure/function.
type SQLGuard ΒΆ
SQLGuard re-exports the internal guard.SQLGuard. It provides SQL injection prevention utilities for Quark ORM.
func NewSQLGuard ΒΆ
func NewSQLGuard() *SQLGuard
NewSQLGuard creates a new SQLGuard with default settings.
type SQLiteDialect ΒΆ
type SQLiteDialect struct {
// contains filtered or unexported fields
}
SQLiteDialect implements the SQLite dialect.
func (*SQLiteDialect) AlterTableAddColumn ΒΆ
func (s *SQLiteDialect) AlterTableAddColumn(table, column, dataType string) string
func (*SQLiteDialect) AlterTableAlterColumn ΒΆ
func (s *SQLiteDialect) AlterTableAlterColumn(table, column, newDataType string) string
func (*SQLiteDialect) AlterTableDropColumn ΒΆ
func (s *SQLiteDialect) AlterTableDropColumn(table, column string) string
func (*SQLiteDialect) BuildProcedureCall ΒΆ
func (s *SQLiteDialect) BuildProcedureCall(procedure string, argCount int) string
func (*SQLiteDialect) BuildRoutineQuery ΒΆ
func (s *SQLiteDialect) BuildRoutineQuery(routine string, argCount int) string
func (*SQLiteDialect) CurrentTimestamp ΒΆ
func (s *SQLiteDialect) CurrentTimestamp() string
func (*SQLiteDialect) JSONExtract ΒΆ
func (s *SQLiteDialect) JSONExtract(column, path string) string
func (*SQLiteDialect) LastInsertIDQuery ΒΆ
func (s *SQLiteDialect) LastInsertIDQuery(table, pkColumn string) string
func (*SQLiteDialect) LimitOffset ΒΆ
func (s *SQLiteDialect) LimitOffset(limit, offset int) string
func (*SQLiteDialect) Placeholder ΒΆ
func (s *SQLiteDialect) Placeholder(index int) string
func (*SQLiteDialect) Placeholders ΒΆ
func (s *SQLiteDialect) Placeholders(n int) []string
func (*SQLiteDialect) Quote ΒΆ
func (s *SQLiteDialect) Quote(identifier string) string
func (*SQLiteDialect) RenameColumn ΒΆ
func (s *SQLiteDialect) RenameColumn(table, oldName, newName string) string
func (*SQLiteDialect) RenameTable ΒΆ
func (s *SQLiteDialect) RenameTable(oldName, newName string) string
func (*SQLiteDialect) Returning ΒΆ
func (s *SQLiteDialect) Returning(columns ...string) string
func (*SQLiteDialect) SupportsLastInsertID ΒΆ
func (s *SQLiteDialect) SupportsLastInsertID() bool
func (*SQLiteDialect) SupportsReturning ΒΆ
func (s *SQLiteDialect) SupportsReturning() bool
func (*SQLiteDialect) SupportsTransactionalDDL ΒΆ
func (s *SQLiteDialect) SupportsTransactionalDDL() bool
type Scope ΒΆ
Scope is a reusable query modifier β a function that receives and returns a *Query[T]. Scopes can be composed via Apply().
type SyncOptions ΒΆ
type SyncOptions struct {
DryRun bool // If true, logs the SQL but doesn't execute it.
NoTransaction bool // If true, doesn't wrap the sync in a transaction.
}
SyncOptions configures the behavior of the Sync operation.
type TenantConfig ΒΆ
type TenantConfig struct {
Strategy TenantStrategy
MaxCachedPools int // Maximum number of DB connection pools to keep open (for DatabasePerTenant)
BaseClient *Client // Used for SchemaPerTenant and RowLevelSecurity
TenantColumn string // Column name for RowLevelSecurity, default is "tenant_id"
}
TenantConfig configures the TenantRouter.
func DefaultTenantConfig ΒΆ
func DefaultTenantConfig() TenantConfig
DefaultTenantConfig provides sensible defaults.
type TenantRouter ΒΆ
type TenantRouter struct {
// contains filtered or unexported fields
}
TenantRouter manages dynamic database connections or queries for different tenants.
func NewTenantRouter ΒΆ
func NewTenantRouter( config TenantConfig, resolver func(ctx context.Context) string, factory func(tenantID string) (*Client, error), ) *TenantRouter
NewTenantRouter creates a new router for multi-tenant database access.
func (*TenantRouter) ActiveTenants ΒΆ
func (r *TenantRouter) ActiveTenants() []string
ActiveTenants returns a list of active tenant connections in the cache.
func (*TenantRouter) GetClient ΒΆ
func (r *TenantRouter) GetClient(ctx context.Context) (*Client, error)
GetClient resolves the tenant ID from the context and returns the corresponding Client. It implements the ClientProvider interface so it can be used with For[T].
func (*TenantRouter) ResolveTenant ΒΆ
func (r *TenantRouter) ResolveTenant(ctx context.Context) (string, error)
ResolveTenant returns the tenant ID for the context.
type TenantStrategy ΒΆ
type TenantStrategy int
TenantStrategy defines how multi-tenancy is handled.
const ( // DatabasePerTenant uses a separate database connection pool per tenant. // This requires an LRU cache to prevent connection exhaustion. DatabasePerTenant TenantStrategy = iota // SchemaPerTenant uses a single database connection pool but prefixes // the table name with the tenant ID (e.g. "tenant_acme.users"). SchemaPerTenant // RowLevelSecurity uses a single database connection pool and injects // a "WHERE tenant_id = ?" condition to every query. RowLevelSecurity )
type Tx ΒΆ
type Tx struct {
// contains filtered or unexported fields
}
Tx wraps *sql.Tx and provides transactional query execution. It shares dialect, guard, observers, and limits from the parent Client.
func (*Tx) ReleaseSavepoint ΒΆ
ReleaseSavepoint releases the named savepoint.
func (*Tx) RollbackTo ΒΆ
RollbackTo rolls back to the named savepoint.
Source Files
ΒΆ
Directories
ΒΆ
| Path | Synopsis |
|---|---|
|
cache
|
|
|
examples
|
|
|
blog-api
command
|
|
|
mssql
command
|
|
|
mysql
command
|
|
|
oracle
command
|
|
|
postgres
command
|
|
|
sqlite
command
|
|
|
internal
|
|
|
guard
Package guard provides SQL injection prevention utilities for Quark ORM.
|
Package guard provides SQL injection prevention utilities for Quark ORM. |
|
migrate
Package migrate provides internal utilities for database schema migrations.
|
Package migrate provides internal utilities for database schema migrations. |
|
schema
Package schema provides struct reflection and model metadata caching for Quark ORM.
|
Package schema provides struct reflection and model metadata caching for Quark ORM. |