Sashimi/README.md
2025-08-22 14:47:48 -05:00

137 lines
2.7 KiB
Markdown

# 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