Documentation
¶
Overview ¶
Example (NamedDriverAccess) ¶
Example_namedDriverAccess demonstrates that all three Open helpers use the same registered driver name and produce a working *sql.DB.
package main
import (
"database/sql"
"fmt"
tsqldriver "github.com/SimonWaldherr/tinySQL/driver"
)
func main() {
db, err := sql.Open(tsqldriver.DriverName, "mem://?tenant=named_test")
if err != nil {
fmt.Println("error:", err)
return
}
defer db.Close()
if err := db.Ping(); err != nil {
fmt.Println("ping error:", err)
return
}
fmt.Println("driver name:", tsqldriver.DriverName)
fmt.Println("ping: ok")
}
Output: driver name: tinysql ping: ok
Index ¶
Examples ¶
Constants ¶
const DriverName = "tinysql"
DriverName is the registered database/sql driver name for tinySQL.
Variables ¶
var ( OpenInMemory = id.OpenInMemory SetDefaultDB = id.SetDefaultDB )
Re-export selected symbols from the internal driver package so external consumers can use a stable public API while the implementation remains hidden under `internal/driver`.
Functions ¶
func Open ¶
Open is a convenience wrapper around `sql.Open(DriverName, dsn)`.
Example ¶
ExampleOpen demonstrates opening a tinySQL in-memory database via database/sql.
package main
import (
"fmt"
tsqldriver "github.com/SimonWaldherr/tinySQL/driver"
)
func main() {
db, err := tsqldriver.Open("mem://?tenant=default")
if err != nil {
fmt.Println("open error:", err)
return
}
defer db.Close()
if _, err := db.Exec(`CREATE TABLE products (id INT, name TEXT, price FLOAT)`); err != nil {
fmt.Println("create error:", err)
return
}
if _, err := db.Exec(`INSERT INTO products VALUES (?, ?, ?)`, 1, "Widget", 9.99); err != nil {
fmt.Println("insert error:", err)
return
}
var name string
var price float64
row := db.QueryRow(`SELECT name, price FROM products WHERE id = ?`, 1)
if err := row.Scan(&name, &price); err != nil {
fmt.Println("scan error:", err)
return
}
fmt.Printf("%s: $%.2f\n", name, price)
}
Output: Widget: $9.99
Example (Transaction) ¶
ExampleOpen_transaction demonstrates wrapping multiple operations in a database/sql transaction.
package main
import (
"context"
"fmt"
tsqldriver "github.com/SimonWaldherr/tinySQL/driver"
)
func main() {
db, err := tsqldriver.Open("mem://?tenant=txdemo")
if err != nil {
fmt.Println("open error:", err)
return
}
defer db.Close()
if _, err := db.Exec(`CREATE TABLE accounts (id INT, balance FLOAT)`); err != nil {
fmt.Println("create error:", err)
return
}
if _, err := db.Exec(`INSERT INTO accounts VALUES (1, 1000.0)`); err != nil {
fmt.Println("insert error:", err)
return
}
if _, err := db.Exec(`INSERT INTO accounts VALUES (2, 500.0)`); err != nil {
fmt.Println("insert error:", err)
return
}
ctx := context.Background()
tx, err := db.BeginTx(ctx, nil)
if err != nil {
fmt.Println("begin error:", err)
return
}
if _, err := tx.ExecContext(ctx, `UPDATE accounts SET balance = balance - ? WHERE id = ?`, 200.0, 1); err != nil {
_ = tx.Rollback()
fmt.Println("update error:", err)
return
}
if _, err := tx.ExecContext(ctx, `UPDATE accounts SET balance = balance + ? WHERE id = ?`, 200.0, 2); err != nil {
_ = tx.Rollback()
fmt.Println("update error:", err)
return
}
if err := tx.Commit(); err != nil {
fmt.Println("commit error:", err)
return
}
rows, err := db.Query(`SELECT id, balance FROM accounts ORDER BY id`)
if err != nil {
fmt.Println("query error:", err)
return
}
defer rows.Close()
for rows.Next() {
var id int
var bal float64
if err := rows.Scan(&id, &bal); err != nil {
fmt.Println("scan error:", err)
return
}
fmt.Printf("account %d: %.0f\n", id, bal)
}
}
Output: account 1: 800 account 2: 700
func OpenFile ¶
OpenFile is a convenience wrapper that opens a file-backed tinySQL database by constructing a `file:` DSN for `sql.Open`.
func OpenWithConfig ¶ added in v0.10.0
OpenWithConfig opens a tinySQL database using explicit settings and validates connectivity with PingContext.
Example ¶
ExampleOpenWithConfig demonstrates config-driven setup with explicit pool and timeout settings, then executes a query via database/sql.
package main
import (
"context"
"fmt"
"time"
tsqldriver "github.com/SimonWaldherr/tinySQL/driver"
)
func main() {
cfg := tsqldriver.DefaultOpenConfig()
cfg.Tenant = "example"
cfg.PoolReaders = 2
cfg.BusyTimeout = 100 * time.Millisecond
cfg.MaxOpenConns = 4
cfg.MaxIdleConns = 2
cfg.PingTimeout = 3 * time.Second
ctx := context.Background()
db, err := tsqldriver.OpenWithConfig(ctx, cfg)
if err != nil {
fmt.Println("open error:", err)
return
}
defer db.Close()
if _, err := db.ExecContext(ctx, `CREATE TABLE notes (id INT, body TEXT)`); err != nil {
fmt.Println("create error:", err)
return
}
if _, err := db.ExecContext(ctx, `INSERT INTO notes VALUES (?, ?)`, 1, "hello tinySQL"); err != nil {
fmt.Println("insert error:", err)
return
}
rows, err := db.QueryContext(ctx, `SELECT id, body FROM notes ORDER BY id`)
if err != nil {
fmt.Println("query error:", err)
return
}
defer rows.Close()
for rows.Next() {
var id int
var body string
if err := rows.Scan(&id, &body); err != nil {
fmt.Println("scan error:", err)
return
}
fmt.Printf("%d: %s\n", id, body)
}
if err := rows.Err(); err != nil {
fmt.Println("rows error:", err)
}
}
Output: 1: hello tinySQL
Types ¶
type OpenConfig ¶ added in v0.10.0
type OpenConfig struct {
// Mode controls DSN scheme. Allowed values: "mem" (default) or "file".
Mode string
// FilePath is required when Mode is "file".
FilePath string
// Tenant maps to DSN option `tenant`. Empty falls back to "default".
Tenant string
// Autosave maps to DSN option `autosave=1` for file mode.
Autosave bool
// PoolReaders maps to DSN option `pool_readers`.
PoolReaders int
// PoolWriters maps to DSN option `pool_writers`.
PoolWriters int
// BusyTimeout maps to DSN option `busy_timeout` (e.g. 250ms, 2s).
BusyTimeout time.Duration
// database/sql pool settings.
MaxOpenConns int
MaxIdleConns int
ConnMaxLifetime time.Duration
ConnMaxIdleTime time.Duration
// PingTimeout is used for startup health-check in OpenWithConfig.
PingTimeout time.Duration
}
OpenConfig describes connection, DSN and database/sql settings for OpenWithConfig.
Best-practice split:
- DSN fields configure tinySQL driver/server behavior (tenant, autosave, pools, busy_timeout).
- database/sql fields configure connection pool behavior (max open/idle/lifetimes).
- PingTimeout validates startup connectivity with PingContext.
func DefaultOpenConfig ¶ added in v0.10.0
func DefaultOpenConfig() OpenConfig
DefaultOpenConfig returns sensible defaults for tinySQL.
func (OpenConfig) DSN ¶ added in v0.10.0
func (c OpenConfig) DSN() (string, error)
DSN builds a tinySQL DSN from OpenConfig.