# Sashimi 🍣 A raw, tasty SQLite wrapper for Go built on top of [zombiezen.com/go/sqlite](https://zombiezen.com/go/sqlite). ## Features - **Simple API** - fmt-style placeholders (`%s`, `%d`) - **Struct scanning** - Automatic field mapping with snake_case conversion - **Built-in migrations** - Numbered SQL file execution with tracking - **Type safety** - Reflection-based struct operations - **Transactions** - Easy atomic operations ## Installation ```bash go get git.sharkk.net/Sharkk/Sashimi ``` ## Quick Start ```go package main import ( "log" "git.sharkk.net/Sharkk/Sashimi" ) type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email"` } func main() { // Connect db, err := sashimi.New("app.db") if err != nil { log.Fatal(err) } defer db.Close() // Insert id, err := db.Insert("users", User{ Name: "Alice", Email: "alice@example.com", }, "ID") // exclude ID field // Get single record var user User err = db.Get(&user, "SELECT * FROM users WHERE id = %d", id) // Get multiple records var users []*User err = db.Select(&users, "SELECT * FROM users WHERE name LIKE %s", "A%") // Update err = db.Update("users", map[string]any{ "email": "alice.new@example.com", }, "id", id) } ``` ## Migrations ### Setup ```go migrator := sashimi.NewMigrator(db, "./migrations") ``` ### Commands ```bash # Run pending migrations go run main.go migrate # Create new migration go run main.go migrate new "create users table" # Check status go run main.go migrate status ``` ### Migration Files Create numbered SQL files in your migrations directory: ```sql -- 1_create_users.sql CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE NOT NULL, created_at INTEGER DEFAULT (strftime('%s', 'now')) ); ``` ## API Reference ### Database Operations ```go // Execute query with result stmt, err := db.Query("SELECT * FROM users WHERE active = %d", 1) // Single row err := db.Get(&user, "SELECT * FROM users WHERE id = %d", 123) // Multiple rows err := db.Select(&users, "SELECT * FROM users") // Execute without result err := db.Exec("DELETE FROM users WHERE id = %d", 123) // Transactions err := db.Transaction(func() error { _, err := db.Insert("users", user) return err }) ``` ### Struct Conventions Go struct fields automatically map to snake_case columns: - `UserID` → `user_id` - `FirstName` → `first_name` - `CreatedAt` → `created_at` ## Configuration The database connection is configured with: - WAL mode for better concurrency - 64MB cache size - Foreign keys enabled ## License MIT