Database

GoNest provides a generic SQL database module that works with any database/sql compatible driver, plus a MongoDB module. Connection pooling, health checks, transactions, and migrations are included.

SQL Database (PostgreSQL, MySQL, SQLite, SQL Server)

import dbsql "github.com/0xfurai/gonest/database/sql"

PostgreSQL

dbModule := dbsql.NewModule(dbsql.Options{
    Driver:   dbsql.DriverPostgres,
    Host:     "localhost",
    Port:     5432,
    User:     "myuser",
    Password: "mypass",
    Database: "mydb",
    SSLMode:  "disable",
})

Requires: import _ "github.com/lib/pq" or import _ "github.com/jackc/pgx/v5/stdlib"

MySQL

dbModule := dbsql.NewModule(dbsql.Options{
    Driver:   dbsql.DriverMySQL,
    Host:     "localhost",
    Port:     3306,
    User:     "root",
    Password: "secret",
    Database: "myapp",
})

Requires: import _ "github.com/go-sql-driver/mysql"

SQLite

dbModule := dbsql.NewModule(dbsql.Options{
    Driver:   dbsql.DriverSQLite,
    Database: "./data.db",             // or ":memory:" for in-memory
    Params:   map[string]string{"_journal_mode": "WAL"},
})

Requires: import _ "modernc.org/sqlite"

SQL Server

dbModule := dbsql.NewModule(dbsql.Options{
    Driver:   dbsql.DriverSQLServer,
    Host:     "localhost",
    User:     "sa",
    Password: "pass",
    Database: "master",
})

From a Raw DSN

dbModule := dbsql.NewModuleFromDSN(dbsql.DriverPostgres,
    "postgres://user:pass@host:5432/db?sslmode=require")

Connection Pool Settings

dbModule := dbsql.NewModule(dbsql.Options{
    Driver:          dbsql.DriverPostgres,
    // ...
    MaxOpenConns:    25,
    MaxIdleConns:    5,
    ConnMaxLifetime: 5 * time.Minute,
    ConnMaxIdleTime: 1 * time.Minute,
})

Transactions

dbsql.Transaction(db, func(tx *sql.Tx) error {
    _, err := tx.Exec("INSERT INTO users (name) VALUES ($1)", "Alice")
    if err != nil {
        return err // auto-rollback
    }
    _, err = tx.Exec("INSERT INTO audit_log (action) VALUES ($1)", "user_created")
    return err // auto-commit on nil
})

Migrations

dbsql.Migrate(db, []string{
    `CREATE TABLE IF NOT EXISTS users (
        id SERIAL PRIMARY KEY,
        name TEXT NOT NULL,
        email TEXT UNIQUE NOT NULL,
        created_at TIMESTAMP DEFAULT NOW()
    )`,
    `CREATE INDEX IF NOT EXISTS idx_users_email ON users(email)`,
})

Health Check

checker := dbsql.NewHealthChecker(db, "postgres")
// Returns: {"status": "up", "openConns": 5, "inUse": 2, "idle": 3}

MongoDB

import "github.com/0xfurai/gonest/database/mongo"

mongoModule := mongo.NewModule(mongo.Options{
    URI:      "mongodb://localhost:27017",
    Database: "mydb",
})

Provides *mongo.Connection with URI and database name.

Repository Pattern

The database package defines a generic Repository[T] interface:

import "github.com/0xfurai/gonest/database"

type Repository[T any] interface {
    FindAll(ctx context.Context) ([]T, error)
    FindByID(ctx context.Context, id any) (*T, error)
    Create(ctx context.Context, entity *T) error
    Update(ctx context.Context, entity *T) error
    Delete(ctx context.Context, id any) error
    Count(ctx context.Context) (int64, error)
}

Implement this with your ORM of choice (GORM, sqlx, ent, Bun, sqlc).

Pagination Helper

import "github.com/0xfurai/gonest/database"

items := fetchAllUsers() // []User
result := database.Paginate(items, page, limit)
// result.Items, result.TotalCount, result.Page, result.Limit