Documentation
¶
Index ¶
- func ApplyBindings(args ...any) (err error)
- func CreateTestingDatabase(driverName string, baseDataSourceName string, uniqueTestID string) (dsn string, err error)
- func IsLockContentionError(err error) bool
- func Nullify[T comparable](value T) any
- func RegisterVirtualFunc(name string, handler func(driverName string, args string) (string, error))
- type Binder
- type DB
- func (db *DB) Begin() (*Tx, error)
- func (db *DB) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error)
- func (db *DB) Close() (err error)
- func (db *DB) ConformArgPlaceholders(stmt string) stringdeprecated
- func (db *DB) DriverName() string
- func (db *DB) Exec(query string, args ...any) (sql.Result, error)
- func (db *DB) ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
- func (db *DB) InsertReturnID(ctx context.Context, idColumn string, stmt string, args ...any) (int64, error)
- func (db *DB) Migrate(sequenceName string, fileSys fs.FS) (err error)
- func (db *DB) NowUTC() stringdeprecated
- func (db *DB) Ping() error
- func (db *DB) PingContext(ctx context.Context) error
- func (db *DB) Prepare(query string) (*Stmt, error)
- func (db *DB) PrepareContext(ctx context.Context, query string) (*Stmt, error)
- func (db *DB) Query(query string, args ...any) (*Rows, error)
- func (db *DB) QueryContext(ctx context.Context, query string, args ...any) (*Rows, error)
- func (db *DB) QueryRow(query string, args ...any) *Row
- func (db *DB) QueryRowContext(ctx context.Context, query string, args ...any) *Row
- func (db *DB) RegexpTextSearch(searchableColumns ...string) stringdeprecated
- func (db *DB) SetLogger(logger *slog.Logger)
- func (db *DB) SetMeterProvider(mp metric.MeterProvider)
- func (db *DB) SetTracerProvider(tp trace.TracerProvider)
- func (db *DB) SimulateRTT(delay time.Duration)
- func (db *DB) Transact(ctx context.Context, fn func(tx *Tx) error) (err error)
- func (db *DB) UnpackQuery(query string) (string, error)
- type Executor
- type Null
- type Row
- type Rows
- type Stmt
- func (s *Stmt) Exec(args ...any) (sql.Result, error)
- func (s *Stmt) ExecContext(ctx context.Context, args ...any) (sql.Result, error)
- func (s *Stmt) Query(args ...any) (*Rows, error)
- func (s *Stmt) QueryContext(ctx context.Context, args ...any) (*Rows, error)
- func (s *Stmt) QueryRow(args ...any) *Row
- func (s *Stmt) QueryRowContext(ctx context.Context, args ...any) *Row
- type Tx
- func (tx *Tx) Commit() error
- func (tx *Tx) DriverName() string
- func (tx *Tx) Err() error
- func (tx *Tx) Exec(query string, args ...any) (sql.Result, error)
- func (tx *Tx) ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
- func (tx *Tx) InsertReturnID(ctx context.Context, idColumn string, stmt string, args ...any) (int64, error)
- func (tx *Tx) Prepare(query string) (*Stmt, error)
- func (tx *Tx) PrepareContext(ctx context.Context, query string) (*Stmt, error)
- func (tx *Tx) Query(query string, args ...any) (*Rows, error)
- func (tx *Tx) QueryContext(ctx context.Context, query string, args ...any) (*Rows, error)
- func (tx *Tx) QueryRow(query string, args ...any) *Row
- func (tx *Tx) QueryRowContext(ctx context.Context, query string, args ...any) *Row
- func (tx *Tx) Rollback() error
- func (tx *Tx) Stmt(stmt *Stmt) *Stmt
- func (tx *Tx) StmtContext(ctx context.Context, stmt *Stmt) *Stmt
- func (tx *Tx) UnpackQuery(query string) (string, error)
- type UnsafeSQL
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func ApplyBindings ¶
ApplyBindings should be called after scanning values from the result set to perform all late binding.
func CreateTestingDatabase ¶ added in v1.6.1
func CreateTestingDatabase(driverName string, baseDataSourceName string, uniqueTestID string) (dsn string, err error)
CreateTestingDatabase provisions a uniquely-named database (or returns a SQLite in-memory DSN) for testing and returns the resolved data source name. Pass the result to Open or OpenSingleton to open a connection.
The returned DSN points at a database whose name has the testing_NN_ prefix. When the last *DB referencing that database is Closed, sequel drops it automatically — no separate cleanup call is required.
uniqueTestID scopes the database so that independent tests don't collide. Pass t.Name() from a test, or an equivalent identifier from production startup code that wants a per-run database:
dsn := cfg.DSN
if cfg.Testing {
dsn, err = sequel.CreateTestingDatabase("", cfg.DSN, cfg.TestID)
if err != nil { return err }
}
db, err := sequel.OpenSingleton("", dsn)
Within a single process, repeated calls with the same (driverName, baseDataSourceName, uniqueTestID) reuse the same testing database — the underlying DROP+CREATE only happens on the first call. Once every handle on that database has been closed it is dropped, and a later call with the same triple provisions it again.
If a driver name is not provided, it is inferred from the data source name on a best-effort basis. Drivers currently supported: "mysql" (MySQL), "pgx" (Postgres), "cockroachdb" (CockroachDB), "mssql" (SQL Server) or "sqlite" (SQLite).
If neither a driver name nor a base data source name is provided, it falls back to the SEQUEL_TESTING_DSN environment variable. This lets any consumer that builds ephemeral test databases through sequel redirect its entire suite at a real server without changing test code: leave SEQUEL_TESTING_DSN unset to keep the SQLite default, or set it to a base DSN to run against that server instead, with the driver inferred from it. Naming a driver — even with an empty DSN — opts out of the fallback, so a test that explicitly asks for SQLite keeps running on SQLite regardless of the environment.
If neither the arguments nor SEQUEL_TESTING_DSN select a server, the following localhost defaults are used based on the driver name:
- (empty): SQLite in-memory database
- sqlite: SQLite in-memory database
- mysql: root:root@tcp(127.0.0.1:3306)/
- pgx: postgres://postgres:postgres@127.0.0.1:5432/
- cockroachdb: postgres://root@127.0.0.1:26257/?sslmode=disable
- mssql: sqlserver://sa:Password123@127.0.0.1:1433
func IsLockContentionError ¶ added in v1.5.7
IsLockContentionError returns true if the error indicates database lock contention or a deadlock. Such errors are transient and the operation can typically be retried. Recognizes lock errors from SQLite, MySQL, PostgreSQL, SQL Server, and CockroachDB.
Classification prefers the driver's native error code (immune to message wording, localization, and user data appearing in error messages); a substring match is used as a fallback for errors whose driver type is not present in the chain (e.g. some wrapped or text-only CockroachDB retry errors).
func Nullify ¶
func Nullify[T comparable](value T) any
Nullify returns nil if the value equals to the zero value of its Go data type, else it returns the value. Use this construct to convert zero values to nil when writing to a nullable database column.
Example:
db.Exec( "INSERT INTO my_table (id, desc, modified_time) VALUES (?,?,?)", obj.ID, sequel.Nullify(obj.Description), sequel.Nullify(obj.ModifiedTime), )
func RegisterVirtualFunc ¶ added in v1.2.0
RegisterVirtualFunc registers a virtual SQL function that will be replaced in queries before execution. The name is matched case-insensitively, e.g. registering "NOW_UTC" matches NOW_UTC(), now_utc(), Now_Utc(), etc. The handler receives the driver name and the string found between the parentheses, and returns the replacement SQL expression, or an error.
Types ¶
type Binder ¶
Binder is a thin wrapper over sql.Null that allows for late-binding of its value.
func Bind ¶
Bind applies a binding function to the scanned value.
Example:
var obj Object
args := []any{
&obj.ID,
sequel.Bind(func(tags string) {
return json.Unmarshal([]byte(tags), &obj.Tags)
}),
sequel.Bind(func(modifiedTime time.Time) {
obj.Year, obj.Month, obj.Day = modifiedTime.Date()
return nil
}),
}
db.QueryRow("SELECT id, tags, modified_time FROM my_table WHERE id=?", id).Scan(args...)
sequel.ApplyBindings(args...)
type DB ¶
DB is an enhanced database connection that
- Limits the size of the connection pool to each server to approx the sqrt of the number of clients
- Performs schema migration
- Automatically creates and connects to a localhost database while testing
func Open ¶
Open returns a database connection to the named data source with a dedicated connection pool. Each call returns a distinct *DB; sequel does not coalesce by DSN. The caller is responsible for sizing the pool via SetMaxOpenConns / SetMaxIdleConns if the database/sql defaults (unlimited open, 2 idle) don't fit.
Use OpenSingleton when multiple consumers in the same process share a DSN and you want sequel to manage one pool across all of them.
If a driver name is not provided, it is inferred from the data source name on a best-effort basis. Drivers currently supported: "mysql" (MySQL), "pgx" (Postgres), "cockroachdb" (CockroachDB), "mssql" (SQL Server) or "sqlite" (SQLite).
Example data source name for each of the supported drivers:
- mysql: username:password@tcp(hostname:3306)/
- pgx: postgres://username:password@hostname:5432/
- cockroachdb: postgres://username:password@hostname:26257/
- mssql: sqlserver://username:password@hostname:1433
- sqlite: file:path/to/database.sqlite
func OpenSingleton ¶ added in v1.6.1
OpenSingleton returns a per-DSN coalesced *DB whose connection pool sequel manages automatically based on the number of openers (sqrt-based growth, see [DB.adjustConnectionLimits]). Multiple OpenSingleton calls with the same (driverName, dataSourceName) return the same *DB and share its connection pool. This is the right choice when many parts of the same process each access the database occasionally.
Use Open when you want a dedicated pool with explicit caller-managed sizing.
Driver inference, DSN defaults, and supported drivers are the same as Open.
func (*DB) Begin ¶ added in v1.4.0
Begin starts a transaction and returns a sequel.Tx that applies virtual function expansion and placeholder conforming.
func (*DB) BeginTx ¶ added in v1.4.0
BeginTx starts a transaction with the given options and returns a sequel.Tx that applies virtual function expansion and placeholder conforming.
func (*DB) Close ¶
Close closes the database connection.
When the underlying database name matches the testing pattern (testing_NN_…), the last handle to close drops the database from the server as a best-effort cleanup, making CreateTestingDatabase-provisioned databases self-cleaning on test teardown. Last across every handle on that database, not just this one: Open hands out a *DB per call, so several may share one testing database.
func (*DB) ConformArgPlaceholders
deprecated
func (*DB) DriverName ¶
DriverName is the name of the driver: "mysql", "pgx", "cockroachdb", "mssql" or "sqlite".
func (*DB) Exec ¶ added in v1.2.0
Exec shadows sql.DB.Exec and conforms arg placeholders for the driver.
func (*DB) ExecContext ¶ added in v1.2.0
ExecContext shadows sql.DB.ExecContext and conforms arg placeholders for the driver.
func (*DB) InsertReturnID ¶ added in v1.3.0
func (db *DB) InsertReturnID(ctx context.Context, idColumn string, stmt string, args ...any) (int64, error)
InsertReturnID executes an INSERT statement and returns the auto-generated ID for the named ID column. idColumn must be a plain identifier matching [A-Za-z_][A-Za-z0-9_]* — it is spliced into the statement on some drivers, so quoted or exotic column names are rejected rather than escaped.
func (*DB) Migrate ¶
Migrate reads all #.sql files from the FS, and executes any new migrations in order of their file name. The order of execution is guaranteed only within the context of a sequence name.
func (*DB) Ping ¶ added in v1.11.0
Ping shadows sql.DB.Ping so a simulated round-trip delay (DB.SimulateRTT) applies to it: a ping is a wire operation like any statement. It is not otherwise instrumented — sequel has never traced a ping.
func (*DB) PingContext ¶ added in v1.11.0
PingContext shadows sql.DB.PingContext for the same reason as DB.Ping. A context that expires during the simulated latency fails the ping without reaching the database.
func (*DB) Prepare ¶ added in v1.2.0
Prepare shadows sql.DB.Prepare and conforms arg placeholders for the driver. It returns a Stmt, which embeds *sql.Stmt so existing stmt.Exec(...)/stmt.Close() call sites are unchanged; executions of the returned statement stay on sequel's instrumented path.
func (*DB) PrepareContext ¶ added in v1.2.0
PrepareContext shadows sql.DB.PrepareContext and conforms arg placeholders for the driver. It returns a Stmt (see Prepare).
func (*DB) Query ¶ added in v1.2.0
Query shadows sql.DB.Query and conforms arg placeholders for the driver. It returns a Rows, which embeds *sql.Rows so existing rows.Next()/rows.Scan()/rows.Err() call sites are unchanged. A *DB query is not transactional, so Rows here is a pure passthrough (no error latching).
func (*DB) QueryContext ¶ added in v1.2.0
QueryContext shadows sql.DB.QueryContext and conforms arg placeholders for the driver. It returns a Rows (see Query); a *DB query does not latch errors into any transaction.
func (*DB) QueryRow ¶ added in v1.2.0
QueryRow shadows sql.DB.QueryRow and conforms arg placeholders for the driver. It returns a Row, which embeds *sql.Row so existing QueryRow(...).Scan(...) call sites are unchanged.
func (*DB) QueryRowContext ¶ added in v1.2.0
QueryRowContext shadows sql.DB.QueryRowContext and conforms arg placeholders for the driver. It returns a Row, which embeds *sql.Row so existing QueryRowContext(...).Scan(...) call sites are unchanged.
func (*DB) RegexpTextSearch
deprecated
func (*DB) SetLogger ¶ added in v1.9.0
SetLogger attaches an slog.Logger. The library does not log operation errors (they are returned to the caller, who logs them); it logs one-off events such as schema migrations at Info, and — when the logger is enabled at Debug level — each query at Debug. Per-query logging is therefore controlled by the logger's own level, not a separate switch. A freshly opened *DB uses a discard logger; pass nil here to revert to that discard logger (disabling logging).
func (*DB) SetMeterProvider ¶ added in v1.9.0
func (db *DB) SetMeterProvider(mp metric.MeterProvider)
SetMeterProvider attaches an OpenTelemetry MeterProvider so sequel emits sequel_ metrics (query and transaction duration, lock-contention count, migration count, and connection-pool gauges). A freshly opened *DB already uses the process-wide otel.GetMeterProvider(); call this to override it, or pass nil to revert to that global provider (whose default is a no-op). See DB.SetTracerProvider for when to call.
func (*DB) SetTracerProvider ¶ added in v1.9.0
func (db *DB) SetTracerProvider(tp trace.TracerProvider)
SetTracerProvider attaches an OpenTelemetry TracerProvider so sequel emits a client span around each query, transaction, and migration. A freshly opened *DB already uses the process-wide otel.GetTracerProvider(); call this to override it, or pass nil to revert to that global provider (whose default is a no-op).
Observability is configured after Open/OpenSingleton (which keep the standard database/sql signature) rather than at construction. This loses nothing: sql.Open does no I/O — it only prepares a lazy pool — so there is no work inside Open worth a span; every operation that does real work happens later on the returned *DB.
Configure before the *DB is used concurrently. For an OpenSingleton-shared *DB the providers are process- wide for that pool; the last setter wins, so configure once from the owning caller.
func (*DB) SimulateRTT ¶ added in v1.11.0
SimulateRTT makes every operation sequel sends over the wire pause for the given duration first, simulating the round-trip latency of a remote server. It is a testing aid: against in-memory SQLite or a server on localhost a round trip costs microseconds, so needlessly chatty code performs the same as code that batches, and timeout paths never fire. Raising the round trip to what a real network costs makes both visible in a test.
The delay is charged per round trip, not per call: a DB.Transact that begins a transaction, runs three statements and commits pays it five times (six on SQL Server, which adds a SET XACT_ABORT ON preamble). It applies to the statement methods (Exec, Query, QueryRow, Prepare, and the Context variants) on DB and Tx, to each execution of a prepared Stmt, to Begin/BeginTx, Commit and Rollback, and to Ping. DB.InsertReturnID is one statement on every driver, so it pays once.
Three things are not charged. A sql.Conn talks to the driver directly, with sequel out of the path. Fetching successive rows from an open Rows is batched by the driver, so a full round trip per Next would model the wire worse than nothing. Lifecycle — Close on a pool or a Stmt, and the DROP that retires a testing database — is not caller-facing work.
The Context variants honor their context: a deadline shorter than the simulated latency fails the operation with the context's error and never reaches the database, as a real round trip outliving its deadline does.
Zero turns the simulation off and is the default; a negative duration is treated as zero. The setting is safe to change while the pool is in use and applies to operations begun after it. A Tx captures it at begin, so one transaction runs at one latency. For a *DB shared by OpenSingleton it is process-wide for that pool — last writer wins — so set it from the owning caller.
This is deliberate latency injection and slows real work exactly as advertised. Keep it behind the same switch that selects your test database.
func (*DB) Transact ¶ added in v1.8.0
Transact runs fn inside a transaction, committing on success and rolling back on error. If the transaction fails on lock contention or a deadlock, it is retried with a short jittered backoff. Because a retry re-executes fn from the start in a new transaction, fn must be safe to run more than once; any non-transactional side effects it performs (in-memory changes, channel sends) may repeat.
The Tx passed to fn records the first statement error and short-circuits the remaining statements, so fn cannot commit partial work even if it does not check every statement's error. For SQL Server, SET XACT_ABORT ON is applied so that any statement error aborts the whole transaction.
func (*DB) UnpackQuery ¶ added in v1.2.0
UnpackQuery expands virtual functions (e.g. NOW_UTC(), REGEXP_TEXT_SEARCH()) into driver-specific SQL expressions, and conforms arg placeholders to the syntax expected by the driver (e.g. ? to $1, $2 for PostgreSQL).
type Executor ¶ added in v1.4.1
type Executor interface {
Exec(query string, args ...any) (sql.Result, error)
ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
Query(query string, args ...any) (*Rows, error)
QueryContext(ctx context.Context, query string, args ...any) (*Rows, error)
QueryRow(query string, args ...any) *Row
QueryRowContext(ctx context.Context, query string, args ...any) *Row
Prepare(query string) (*Stmt, error)
PrepareContext(ctx context.Context, query string) (*Stmt, error)
InsertReturnID(ctx context.Context, idColumn string, stmt string, args ...any) (int64, error)
DriverName() string
UnpackQuery(query string) (string, error)
}
Executor is the interface satisfied by both DB and Tx.
type Null ¶
Null is a thin wrapper over sql.Null that allows for reading NULL values.
func Nullable ¶
Nullable is a simple binder that interprets NULL values to be the zero value of their Go data type.
Example:
var obj Object
args := []any{
&obj.ID,
sequel.Nullable(&obj.Description),
sequel.Nullable(&obj.ModifiedTime),
}
db.QueryRow("SELECT id, desc, modified_time FROM my_table WHERE id=?", id).Scan(args...)
sequel.ApplyBindings(args...)
type Row ¶ added in v1.9.0
Row shadows *sql.Row so sequel can observe a single-row query and latch its error into a DB.Transact-managed transaction. database/sql does not surface a QueryRow error until Scan, so Row records the operation's duration, classifies lock contention, and ends the span when the caller calls Scan (or Err). It embeds *sql.Row, so the common QueryRow(...).Scan(...) call site is unchanged; only code that explicitly stores the result as *sql.Row needs adjustment.
In Transact (autoErr) mode Scan/Err also latch the error into the transaction, exactly as Rows does for a streamed read, so a closure that ignores a QueryRow error cannot commit work built on a row it never read. sql.ErrNoRows is deliberately exempt: unlike a Rows iteration, where an empty result set is simply Next returning false, "no row" reaches a QueryRow caller as an error and is routine control flow (`if err == sql.ErrNoRows { ...default... }`). Latching it would doom every transaction that legitimately handles a missing row. Every other error — deadlock, type-conversion failure, connection drop — is latched. Outside a Transact-managed Tx, recordErr is nil and no latching occurs.
As with *sql.Row, a Row whose Scan/Err is never called holds resources open — and here, leaves its span unended. Call Scan (or Err) exactly as you would with *sql.Row.
type Rows ¶ added in v1.10.7
Rows shadows *sql.Rows so sequel can latch a row-iteration or Scan error into a DB.Transact-managed transaction, completing the "no partial commit" guarantee for streamed reads.
Transact already records the first Exec/Query *statement* error and short-circuits the rest, so a closure that ignores a statement's error still cannot commit half its work. The gap that remained was the errors that surface *while iterating a result set* — a mid-stream Scan failure or a streaming error reported by rows.Err(). Those were invisible to Transact, so a closure that read rows in a loop and forgot to check rows.Err() could build state from a truncated read and commit it. Rows closes that gap: Scan and the end-of-iteration Err are latched exactly like a statement error, so such a closure can no longer commit partial work.
It embeds *sql.Rows, so the usual `for rows.Next() { rows.Scan(...) }`, `rows.Err()`, and `rows.Close()` call sites are unchanged; only code that explicitly stores the result as *sql.Rows needs adjustment (the same source-compat caveat as Row). Outside a Transact-managed Tx — a *DB query, or a Tx obtained from DB.BeginTx — recordErr is nil, so Rows is a pure passthrough and behaves exactly like *sql.Rows.
func (*Rows) Err ¶ added in v1.10.7
Err shadows sql.Rows.Err and latches the streaming error, so an explicit rows.Err() check aborts the transaction as well as surfacing the error to the caller.
func (*Rows) Next ¶ added in v1.10.7
Next shadows sql.Rows.Next. When iteration ends (Next returns false) it latches any streaming error (rows.Err()), so a `for rows.Next()` loop that never checks rows.Err() still aborts the transaction on a mid-stream failure. An early break (Next still returning true) latches nothing — the caller stopped deliberately, and a streaming error would itself have made Next return false.
func (*Rows) NextResultSet ¶ added in v1.11.0
NextResultSet shadows sql.Rows.NextResultSet. Like Next, a false return latches the streaming error, so a multi-result-set loop that never checks rows.Err() still aborts the transaction when advancing to the next result set failed rather than ran out.
type Stmt ¶ added in v1.11.0
Stmt is a prepared statement that shadows sql.Stmt so that executing it stays on sequel's path: each execution emits a span and a duration sample, is classified for lock contention, and pays the simulated round-trip delay (DB.SimulateRTT). Inside a DB.Transact transaction, an execution error is recorded into the transaction and subsequent statements short-circuit, exactly as for a statement issued through Tx directly — a closure that ignores a prepared statement's error cannot commit partial work.
It embeds *sql.Stmt, so stmt.Exec(...)/stmt.Query(...)/stmt.Close() call sites are unchanged; only code that explicitly stores the result of Prepare as *sql.Stmt needs adjustment (the same source-compat shape as Rows and Row).
A Stmt prepared on a DB reads the pool's telemetry and simulated delay at each execution; a Stmt bound to a Tx (from Tx.Prepare or Tx.Stmt) uses the snapshots the transaction captured when it began, so one transaction runs at one consistent latency. Close is a passthrough: releasing the statement handle is lifecycle, not caller-facing work.
func (*Stmt) ExecContext ¶ added in v1.11.0
ExecContext shadows sql.Stmt.ExecContext.
func (*Stmt) Query ¶ added in v1.11.0
Query shadows sql.Stmt.Query. It returns a Rows, which embeds *sql.Rows so existing call sites are unchanged; inside a Transact transaction it latches row-read errors like any Tx query.
func (*Stmt) QueryContext ¶ added in v1.11.0
QueryContext shadows sql.Stmt.QueryContext. It returns a Rows (see Query).
type Tx ¶ added in v1.4.0
Tx is an in-progress database transaction that shadows sql.Tx methods to apply virtual function expansion and placeholder conforming.
When created by DB.Transact, a Tx records the first statement error and short-circuits subsequent statements (returning that error without touching the database). This guarantees a transaction cannot commit partial state when a caller forgets to check a statement's error, and it surfaces a deadlock (rather than masking it as a later "COMMIT has no corresponding BEGIN" on some drivers) so Transact can retry. A Tx obtained from DB.BeginTx does not do this — its statement methods behave exactly like the underlying sql.Tx.
func (*Tx) Commit ¶ added in v1.11.0
Commit shadows sql.Tx.Commit so the COMMIT round trip is instrumented like any statement: it emits its own span (nested under the transaction), records into sequel_query_duration as operation COMMIT, is classified for sequel_lock_contention, and pays any simulated round-trip delay (DB.SimulateRTT). Classification matters here because a serialization failure most often surfaces at commit on CockroachDB and on PostgreSQL under SERIALIZABLE.
A call that answers sql.ErrTxDone never reaches the database, so it emits no span, records no duration, and pays no delay. Return values are identical to sql.Tx throughout.
Behavior is otherwise unchanged, including in Transact mode: Transact decides whether to commit before calling this, and a commit error is not recorded into Tx.Err.
func (*Tx) DriverName ¶ added in v1.4.0
DriverName is the name of the driver: "mysql", "pgx", "cockroachdb", "mssql" or "sqlite".
func (*Tx) Err ¶ added in v1.8.0
Err returns the first statement error recorded in Transact mode, or nil. Always nil for a Tx obtained from BeginTx.
func (*Tx) Exec ¶ added in v1.4.0
Exec shadows sql.Tx.Exec and conforms arg placeholders for the driver.
func (*Tx) ExecContext ¶ added in v1.4.0
ExecContext shadows sql.Tx.ExecContext and conforms arg placeholders for the driver.
func (*Tx) InsertReturnID ¶ added in v1.4.0
func (tx *Tx) InsertReturnID(ctx context.Context, idColumn string, stmt string, args ...any) (int64, error)
InsertReturnID executes an INSERT statement and returns the auto-generated ID for the named ID column. idColumn must be a plain identifier matching [A-Za-z_][A-Za-z0-9_]* — it is spliced into the statement on some drivers, so quoted or exotic column names are rejected rather than escaped.
func (*Tx) Prepare ¶ added in v1.4.0
Prepare shadows sql.Tx.Prepare and conforms arg placeholders for the driver. It returns a Stmt bound to this transaction: in Transact mode an execution error is recorded and short-circuits later statements, exactly as for a statement issued through the Tx directly.
func (*Tx) PrepareContext ¶ added in v1.4.0
PrepareContext shadows sql.Tx.PrepareContext and conforms arg placeholders for the driver. It returns a Stmt bound to this transaction (see Prepare).
func (*Tx) Query ¶ added in v1.4.0
Query shadows sql.Tx.Query and conforms arg placeholders for the driver. It returns a Rows, which embeds *sql.Rows so existing rows.Next()/rows.Scan()/rows.Err() call sites are unchanged. In Transact (autoErr) mode the returned Rows latches a mid-iteration Scan or streaming error into the transaction, so a closure that forgets rows.Err() cannot commit state read from a truncated result set.
func (*Tx) QueryContext ¶ added in v1.4.0
QueryContext shadows sql.Tx.QueryContext and conforms arg placeholders for the driver. It returns a Rows (see Query) that latches row-iteration errors into the transaction in Transact (autoErr) mode.
func (*Tx) QueryRow ¶ added in v1.4.0
QueryRow shadows sql.Tx.QueryRow and conforms arg placeholders for the driver. It returns a Row, which embeds *sql.Row so existing QueryRow(...).Scan(...) call sites are unchanged. In Transact (autoErr) mode the Row latches its Scan/Err error into the transaction (except sql.ErrNoRows — see Row).
func (*Tx) QueryRowContext ¶ added in v1.4.0
QueryRowContext shadows sql.Tx.QueryRowContext and conforms arg placeholders for the driver. It returns a Row (see QueryRow) that latches its error into the transaction in Transact (autoErr) mode.
func (*Tx) Rollback ¶ added in v1.11.0
Rollback shadows sql.Tx.Rollback for the same reasons as Tx.Commit, and handles an already-finalized transaction the same way. A rollback is a round trip whether or not anything went right, so it is instrumented while the transaction unwinds after a failure too.
func (*Tx) Stmt ¶ added in v1.11.0
Stmt shadows sql.Tx.Stmt: it binds a statement prepared on the DB to this transaction. The returned Stmt is transaction-bound, so in Transact mode its execution errors are recorded and short-circuit later statements — a prepared statement is not an escape hatch from the no-partial-commit guarantee.
func (*Tx) StmtContext ¶ added in v1.11.0
StmtContext shadows sql.Tx.StmtContext (see Stmt).
func (*Tx) UnpackQuery ¶ added in v1.4.0
UnpackQuery expands virtual functions (e.g. NOW_UTC(), REGEXP_TEXT_SEARCH()) into driver-specific SQL expressions, and conforms arg placeholders to the syntax expected by the driver (e.g. ? to $1, $2 for PostgreSQL).