ChaiSQL
ChaiSQL is a modern embedded SQL database, focusing on flexibility and ease of use for developers. It provides a fresh alternative to traditional embedded databases by offering advanced features tailored for modern applications.
Key Features
- Modern SQL Experience: ChaiSQL introduces a modern twist to traditional SQL embedded databases
- Optimized for Go: Native Go implementation with no CGO dependency.
- Solid foundations: ChaiSQL is backed by Pebble for native Go toolchains, and RocksDB for non-Go or CGO builds (coming soon).
- Schema Flexibility: Support for strict, partial, and schemaless table designs, catering to various data modeling needs.
Roadmap
ChaiSQL is work in progress and is not ready yet for production.
Here is a high level list of features that we want to implement in the near future, in no particular order:
Installation
Install the ChaiSQL database
go install github.com/chaisql/chai
Quickstart
package main
import (
"context"
"fmt"
"log"
"github.com/chaisql/chai"
)
func main() {
db, err := chai.Open("mydb")
if err != nil {
log.Fatal(err)
}
defer db.Close()
err = db.Exec(`
CREATE TABLE user (
id INT PRIMARY KEY,
name TEXT NOT NULL UNIQUE,
created_at TIMESTAMP NOT NULL,
address (
city TEXT DEFAULT "unknown",
zipcode TEXT
),
friends ARRAY,
CHECK len(friends) > 0
)
`)
err = db.Exec(`
INSERT INTO user (id, name, age, address, friends)
VALUES (
11,
'Foo2',
20,
{city: "Lyon", zipcode: "69001"},
["foo", "bar", "baz"]
)`)
type User struct {
ID uint
Name string
TheAgeOfTheUser float64 `chai:"age"`
Address struct {
City string
ZipCode string
}
}
u := User{
ID: 20,
Name: "foo",
TheAgeOfTheUser: 40,
}
u.Address.City = "Lyon"
u.Address.ZipCode = "69001"
err = db.Exec(`INSERT INTO user VALUES ?`, &u)
rows, err := db.Query("SELECT id, name, age, address FROM user WHERE age >= ?", 18)
defer rows.Close()
err = rows.Iterate(func(r *chai.Row) error {
err = r.Scan(...)
err = r.StructScan(...)
err = r.MapScan(...)
return nil
})
}
Checkout the Go doc and the usage example in the README to get started quickly.
In-memory database
For in-memory operations, simply use :memory:
:
db, err := chai.Open(":memory:")
Using database/sql
import _ "github.com/chaisql/chai/driver"
db, err := sql.Open("chai", "mydb")
if err != nil {
log.Fatal(err)
}
defer db.Close()
res, err := db.ExecContext(...)
res, err := db.Query(...)
res, err := db.QueryRow(...)
var u User
err = res.Scan(driver.Scanner(&u))
chai shell
The chai command line provides an SQL shell for database management:
go install github.com/chaisql/chai/cmd/chai@latest
Usage example:
chai
chai dirName
Contributing
Contributions are welcome!
A big thanks to our contributors!
Made with contrib.rocks.
For any questions or discussions, open an issue.