goSqlite

package module
v0.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 28, 2026 License: MIT Imports: 14 Imported by: 0

README

[!NOTE] This README was generated by Claude Code, get the ZH version from here.

cover

go-sqlite

pkg tag license

A lightweight Go SQLite query builder with fluent chainable API for simplified CRUD operations, supporting Context propagation and conflict handling strategies.

Table of Contents

Features

  • Chainable API: Fluent query building syntax with Table().Where().Get() chaining
  • Multi-database Connection Management: Singleton Connector manages multiple SQLite databases
  • Full CRUD Support: Complete Create, Insert, Select, Update operations
  • Context Propagation: Timeout and cancellation support via Context(ctx) chaining
  • Conflict Handling Strategies: Supports Ignore, Replace, Abort, Fail, Rollback
  • Rich WHERE Conditions: Eq, NotEq, Gt, Lt, Ge, Le, In, NotIn, Null, NotNull, Between
  • Column Validation: Automatic SQL reserved word and identifier format checking
  • WAL Mode: Enabled by default for improved concurrency performance

Installation

go get github.com/pardnchiu/go-sqlite

Usage

Initialize Connection
package main

import (
    "log"
    goSqlite "github.com/pardnchiu/go-sqlite"
)

func main() {
    // Create connection (singleton pattern, can register multiple databases)
    conn, err := goSqlite.New(goSqlite.Config{
        Key:      "main",           // Optional, defaults to filename
        Path:     "./data.db",
        Lifetime: 3600,             // Optional, connection lifetime in seconds
    })
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()
}
Create Table
builder, _ := conn.DB("main")
err := builder.Table("users").Create(
    goSqlite.Column{Name: "id", Type: "INTEGER", IsPrimary: true, AutoIncrease: true},
    goSqlite.Column{Name: "name", Type: "TEXT", IsNullable: false},
    goSqlite.Column{Name: "email", Type: "TEXT", IsUnique: true},
    goSqlite.Column{Name: "age", Type: "INTEGER", Default: 0},
)
Insert Data
builder, _ := conn.DB("main")

// Basic insert, returns LastInsertId
id, err := builder.Table("users").Insert(map[string]any{
    "name":  "Alice",
    "email": "alice@example.com",
    "age":   25,
})

// With Context
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

id, err = builder.Table("users").
    Context(ctx).
    Insert(map[string]any{
        "name": "Bob",
    })

// Conflict handling
id, err = builder.Table("users").
    Conflict(goSqlite.Ignore).
    Insert(map[string]any{"email": "alice@example.com"})
Query Data
builder, _ := conn.DB("main")

// Query multiple rows
rows, err := builder.Table("users").
    Select("id", "name", "email").
    WhereGt("age", 18).
    OrderBy("name", goSqlite.Asc).
    Limit(10).
    Offset(0).
    Get()

// Query single row
row, err := builder.Table("users").
    WhereEq("id", 1).
    First()

// Count
count, err := builder.Table("users").
    WhereNotNull("email").
    Count()

// Query with total count (for pagination)
rows, err := builder.Table("users").
    Total().
    Limit(10).
    Get()
Update Data
builder, _ := conn.DB("main")

// Basic update, returns RowsAffected
affected, err := builder.Table("users").
    WhereEq("id", 1).
    Update(map[string]any{"name": "Alice Updated"})

// Increment numeric value
_, err = builder.Table("users").
    WhereEq("id", 1).
    Increase("login_count", 1).
    Update()

// Toggle boolean
_, err = builder.Table("users").
    WhereEq("id", 1).
    Toggle("is_active").
    Update()
Compound Conditions
builder, _ := conn.DB("main")

// AND conditions
rows, _ := builder.Table("users").
    WhereGe("age", 18).
    WhereLe("age", 30).
    WhereNotNull("email").
    Get()

// OR conditions
rows, _ := builder.Table("users").
    WhereEq("status", "active").
    OrWhereEq("role", "admin").
    Get()

// IN condition
rows, _ := builder.Table("users").
    WhereIn("id", []any{1, 2, 3}).
    Get()

// BETWEEN condition
rows, _ := builder.Table("users").
    WhereBetween("age", 20, 30).
    Get()
JOIN Queries
builder, _ := conn.DB("main")

rows, _ := builder.Table("orders").
    Select("orders.id", "users.name", "orders.total").
    LeftJoin("users", "users.id = orders.user_id").
    WhereGt("orders.total", 100).
    Get()
Raw SQL
// Execute via Connector
rows, err := conn.Query("main", "SELECT * FROM users WHERE age > ?", 18)

// Or get *sql.DB directly
builder, _ := conn.DB("main")
db := builder.Raw()
rows, err := db.Query("SELECT * FROM users")

API Reference

Config
Field Type Description
Key string Database identifier key, optional, defaults to filename
Path string SQLite file path
Lifetime int Maximum connection lifetime in seconds, optional
Connector Methods
Method Description
New(Config) (*Connector, error) Create or get Connector singleton
DB(key string) (*Builder, error) Get Builder for specified database
Query(key, query string, args ...any) Execute raw query
QueryContext(ctx, key, query string, args ...any) Execute raw query with Context
Exec(key, query string, args ...any) Execute raw command
ExecContext(ctx, key, query string, args ...any) Execute raw command with Context
Close() Close all database connections
Builder Methods
Category Method Description
Basic Table(name string) Specify table
Context(ctx context.Context) Set Context
Raw() *sql.DB Get underlying *sql.DB
Schema Create(columns ...Column) Create table
Insert Insert(data ...map[string]any) (int64, error) Insert data, returns LastInsertId
Conflict(conflict) *Builder Set conflict handling strategy
Select Select(columns ...string) Specify columns to select
Get() (*sql.Rows, error) Get multiple rows
First() (*sql.Row, error) Get single row
Count() (int64, error) Get count
Total() *Builder Enable total count calculation
Where Where(condition string, args ...any) Custom WHERE condition
WhereEq / WhereNotEq Equal / Not equal
WhereGt / WhereLt Greater than / Less than
WhereGe / WhereLe Greater or equal / Less or equal
WhereIn / WhereNotIn IN / NOT IN
WhereNull / WhereNotNull IS NULL / IS NOT NULL
WhereBetween BETWEEN
OrWhere... OR versions of condition methods
Order/Limit OrderBy(column string, direction ...direction) Order by (Asc/Desc)
Limit(num ...int) Limit rows
Offset(num int) Offset
JOIN Join(table, on string) INNER JOIN
LeftJoin(table, on string) LEFT JOIN
Update Update(data ...map[string]any) (int64, error) Update data, returns RowsAffected
Increase(column string, num ...int) Increment numeric value
Decrease(column string, num ...int) Decrement numeric value
Toggle(column string) Toggle boolean
Conflict Strategies
Constant Description
Ignore Ignore conflict, skip insert
Replace Delete old row and insert new
Abort Abort transaction and rollback (default)
Fail Abort but preserve previous changes
Rollback Rollback entire transaction
Column Structure
Field Type Description
Name string Column name
Type string SQLite type (INTEGER, TEXT, REAL, BLOB)
IsPrimary bool Primary key
AutoIncrease bool Auto increment
IsNullable bool Nullable
IsUnique bool Unique constraint
Default any Default value
ForeignKey *Foreign Foreign key configuration

License

This project is licensed under the MIT License - see the LICENSE file for details.

Author

邱敬幃 Pardn Chiu

Stars

Star


©️ 2026 邱敬幃 Pardn Chiu

Documentation

Index

Constants

View Source
const (
	Ignore conflict = iota
	Replace
	Abort
	Fail
	Rollback
)
View Source
const (
	Asc direction = iota
	Desc
)

Variables

This section is empty.

Functions

This section is empty.

Types

type Builder

type Builder struct {
	// contains filtered or unexported fields
}

func NewBuilder

func NewBuilder(db *sql.DB) *Builder

func (*Builder) Conflict

func (b *Builder) Conflict(conflict conflict) *Builder

func (*Builder) Context added in v0.3.0

func (b *Builder) Context(ctx context.Context) *Builder

func (*Builder) Count

func (b *Builder) Count() (int64, error)

func (*Builder) CountContext

func (b *Builder) CountContext(ctx context.Context) (int64, error)

! Deprecated: Use Context(ctx).Count() in v1.0.0

func (*Builder) Create

func (b *Builder) Create(columns ...Column) error

func (*Builder) Decrease

func (b *Builder) Decrease(column string, num ...int) *Builder

func (*Builder) Delete added in v0.3.0

func (b *Builder) Delete(force ...bool) (int64, error)

func (*Builder) ExecAutoAsignContext added in v0.3.0

func (b *Builder) ExecAutoAsignContext(query string, args ...any) (sql.Result, error)

func (*Builder) First

func (b *Builder) First() (*sql.Row, error)

func (*Builder) FirstContext

func (b *Builder) FirstContext(ctx context.Context) (*sql.Row, error)

! Deprecated: Use Context(ctx).First() in v1.0.0

func (*Builder) Get

func (b *Builder) Get() (*sql.Rows, error)

func (*Builder) GetContext

func (b *Builder) GetContext(ctx context.Context) (*sql.Rows, error)

! Deprecated: Use Context(ctx).Get() in v1.0.0

func (*Builder) GetWithTotal

func (b *Builder) GetWithTotal() (*sql.Rows, error)

! Deprecated: Use Total(ctx).Get() in v1.0.0

func (*Builder) GetWithTotalContext

func (b *Builder) GetWithTotalContext(ctx context.Context) (*sql.Rows, error)

! Deprecated: Use Total(ctx).Context(ctx).Get() in v1.0.0

func (*Builder) Increase

func (b *Builder) Increase(column string, num ...int) *Builder

func (*Builder) Insert

func (b *Builder) Insert(data ...map[string]any) (int64, error)

func (*Builder) InsertConflict

func (b *Builder) InsertConflict(conflict conflict, data ...map[string]any) (int64, error)

! Deprecated: Use Conflict(conflict).Insert() in v1.0.0

func (*Builder) InsertConflictReturningID

func (b *Builder) InsertConflictReturningID(conflict conflict, data ...map[string]any) (int64, error)

! Deprecated: Use Conflict(conflict).Insert() in v1.0.0

func (*Builder) InsertContexConflict

func (b *Builder) InsertContexConflict(ctx context.Context, conflict conflict, data ...map[string]any) (int64, error)

! Deprecated: Use Conflict(conflict).Context(ctx).Insert() in v1.0.0

func (*Builder) InsertContext

func (b *Builder) InsertContext(ctx context.Context, data ...map[string]any) (int64, error)

! Deprecated: Use Context(ctx).Insert() in v1.0.0

func (*Builder) InsertContextConflictReturningID

func (b *Builder) InsertContextConflictReturningID(ctx context.Context, conflict conflict, data ...map[string]any) (int64, error)

! Deprecated: Use Conflict(conflict).Context(ctx).Insert() in v1.0.0

func (*Builder) InsertContextReturningID

func (b *Builder) InsertContextReturningID(ctx context.Context, data ...map[string]any) (int64, error)

! Deprecated: Use Context(ctx).Insert() in v1.0.0

func (*Builder) InsertReturningID

func (b *Builder) InsertReturningID(data ...map[string]any) (int64, error)

! Deprecated: Use Insert() in v1.0.0

func (*Builder) Join

func (b *Builder) Join(table, on string) *Builder

func (*Builder) LeftJoin

func (b *Builder) LeftJoin(table, on string) *Builder

func (*Builder) Limit

func (b *Builder) Limit(num ...int) *Builder

func (*Builder) Offset

func (b *Builder) Offset(num int) *Builder

func (*Builder) OrWhere

func (b *Builder) OrWhere(condition string, args ...any) *Builder

func (*Builder) OrWhereBetween

func (b *Builder) OrWhereBetween(column string, start, end any) *Builder

func (*Builder) OrWhereEq

func (b *Builder) OrWhereEq(column string, value any) *Builder

func (*Builder) OrWhereGe

func (b *Builder) OrWhereGe(column string, value any) *Builder

func (*Builder) OrWhereGt

func (b *Builder) OrWhereGt(column string, value any) *Builder

func (*Builder) OrWhereIn

func (b *Builder) OrWhereIn(column string, values []any) *Builder

func (*Builder) OrWhereLe

func (b *Builder) OrWhereLe(column string, value any) *Builder

func (*Builder) OrWhereLt

func (b *Builder) OrWhereLt(column string, value any) *Builder

func (*Builder) OrWhereNotEq

func (b *Builder) OrWhereNotEq(column string, value any) *Builder

func (*Builder) OrWhereNotIn

func (b *Builder) OrWhereNotIn(column string, values []any) *Builder

func (*Builder) OrWhereNotNull

func (b *Builder) OrWhereNotNull(column string) *Builder

func (*Builder) OrWhereNull

func (b *Builder) OrWhereNull(column string) *Builder

func (*Builder) OrderBy

func (b *Builder) OrderBy(column string, direction ...direction) *Builder

func (*Builder) Raw

func (b *Builder) Raw() *sql.DB

func (*Builder) Select

func (b *Builder) Select(columns ...string) *Builder

func (*Builder) Table

func (b *Builder) Table(name string) *Builder

func (*Builder) Toggle

func (b *Builder) Toggle(column string) *Builder

func (*Builder) Total

func (b *Builder) Total() *Builder

func (*Builder) Update

func (b *Builder) Update(data ...map[string]any) (int64, error)

func (*Builder) UpdateContext

func (b *Builder) UpdateContext(ctx context.Context, data ...map[string]any) (int64, error)

! Deprecated: Use Context(ctx).Update() in v1.0.0

func (*Builder) Where

func (b *Builder) Where(condition string, args ...any) *Builder

func (*Builder) WhereBetween

func (b *Builder) WhereBetween(column string, start, end any) *Builder

func (*Builder) WhereEq

func (b *Builder) WhereEq(column string, value any) *Builder

func (*Builder) WhereGe

func (b *Builder) WhereGe(column string, value any) *Builder

func (*Builder) WhereGt

func (b *Builder) WhereGt(column string, value any) *Builder

func (*Builder) WhereIn

func (b *Builder) WhereIn(column string, values []any) *Builder

func (*Builder) WhereLe

func (b *Builder) WhereLe(column string, value any) *Builder

func (*Builder) WhereLt

func (b *Builder) WhereLt(column string, value any) *Builder

func (*Builder) WhereNotEq

func (b *Builder) WhereNotEq(column string, value any) *Builder

func (*Builder) WhereNotIn

func (b *Builder) WhereNotIn(column string, values []any) *Builder

func (*Builder) WhereNotNull

func (b *Builder) WhereNotNull(column string) *Builder

func (*Builder) WhereNull

func (b *Builder) WhereNull(column string) *Builder

type Column

type Column struct {
	Name         string
	Type         string
	IsPrimary    bool
	IsNullable   bool
	AutoIncrease bool
	IsUnique     bool
	Default      any
	ForeignKey   *Foreign
}

type Config

type Config struct {
	Key      string `json:"key,omitempty"`
	Path     string `json:"path"`
	Lifetime int    `json:"lifetime,omitempty"` // sec
}

type Connector

type Connector struct {
	// contains filtered or unexported fields
}

func New

func New(c Config) (*Connector, error)

func (*Connector) Close

func (d *Connector) Close()

func (*Connector) DB

func (d *Connector) DB(key string) (*Builder, error)

func (*Connector) Exec

func (d *Connector) Exec(key, query string, args ...any) (sql.Result, error)

func (*Connector) ExecContext

func (d *Connector) ExecContext(ctx context.Context, key, query string, args ...any) (sql.Result, error)

func (*Connector) Query

func (d *Connector) Query(key, query string, args ...any) (*sql.Rows, error)

func (*Connector) QueryContext

func (d *Connector) QueryContext(ctx context.Context, key, query string, args ...any) (*sql.Rows, error)

type Foreign

type Foreign struct {
	Table  string
	Column string
}

type Join

type Join struct {
	// contains filtered or unexported fields
}

type Union added in v0.3.0

type Union struct {
	// contains filtered or unexported fields
}

type Where

type Where struct {
	// contains filtered or unexported fields
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL