From 9235633d676b33ef22fed22777b286d3e46c23cc Mon Sep 17 00:00:00 2001 From: sno6 Date: Sun, 16 Apr 2023 11:44:34 +1200 Subject: [PATCH] Support Go. --- README.md | 38 ++++++++++++++++++++++++++++++++++++++ go/README.md | 43 +++++++++++++++++++++++++++++++++++++++++++ go/example/main.go | 29 +++++++++++++++++++++++++++++ go/go.mod | 5 +++++ go/go.sum | 2 ++ go/vss.go | 20 ++++++++++++++++++++ 6 files changed, 137 insertions(+) create mode 100644 go/README.md create mode 100644 go/example/main.go create mode 100644 go/go.mod create mode 100644 go/go.sum create mode 100644 go/vss.go diff --git a/README.md b/README.md index e99715a..086b810 100644 --- a/README.md +++ b/README.md @@ -177,6 +177,44 @@ console.log(version); See [`deno/sqlite-vss/README.md`](./deno/README.md) for more details. +### Go + +For Go developers, use the [Go](./go) module: + +```go +package main + +import ( + "fmt" + "log" + + vss "github.com/asg017/sqlite-vss/go" +) + +func main() { + // /usr/local/lib/sqlite/ext/sqlite-vss is where vss0 and vector0 are stored. + db, err := vss.Open("vss-example.db", "/usr/local/lib/sqlite/ext/sqlite-vss") + if err != nil { + log.Fatal() + } + defer db.Close() + + r := db.QueryRow("select vss_version();") + if err := r.Err(); err != nil { + log.Fatal(err) + } + + var versions any + if err := r.Scan(&versions); err != nil { + log.Fatal(err) + } + + fmt.Println(versions) +} +``` + +See [`go/README.md`](./go/README.md) for more details. + ### Datasette And for [Datasette](https://datasette.io/), install the [`datasette-sqlite-vss` plugin](https://datasette.io/plugins/datasette-sqlite-vss) with: diff --git a/go/README.md b/go/README.md new file mode 100644 index 0000000..8d5f834 --- /dev/null +++ b/go/README.md @@ -0,0 +1,43 @@ +# sqlite-vss Go package + + +This package wraps the [go-sqlite3](https://github.com/mattn/go-sqlite3) driver and automatically loads extensions when opening a database connection. + +```go +package main + +import ( + "fmt" + "log" + + vss "github.com/asg017/sqlite-vss/go" +) + +func main() { + // /usr/local/lib/sqlite/ext/sqlite-vss is where vss0 and vector0 are stored. + db, err := vss.Open("vss-example.db", "/usr/local/lib/sqlite/ext/sqlite-vss") + if err != nil { + log.Fatal() + } + defer db.Close() + + r := db.QueryRow("select vss_version();") + if err := r.Err(); err != nil { + log.Fatal(err) + } + + var versions any + if err := r.Scan(&versions); err != nil { + log.Fatal(err) + } + + fmt.Println(versions) +} +``` + +## Installing + + +```bash +go get github.com/asg017/sqlite-vss/go +``` diff --git a/go/example/main.go b/go/example/main.go new file mode 100644 index 0000000..7aa8b8d --- /dev/null +++ b/go/example/main.go @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "log" + + vss "github.com/asg017/sqlite-vss/go" +) + +func main() { + // /usr/local/lib/sqlite/ext/sqlite-vss is where vss0 and vector0 are stored. + db, err := vss.Open("vss-example.db", "/usr/local/lib/sqlite/ext/sqlite-vss") + if err != nil { + log.Fatal() + } + defer db.Close() + + r := db.QueryRow("select vss_version();") + if err := r.Err(); err != nil { + log.Fatal(err) + } + + var versions any + if err := r.Scan(&versions); err != nil { + log.Fatal(err) + } + + fmt.Println(versions) +} diff --git a/go/go.mod b/go/go.mod new file mode 100644 index 0000000..ac8047a --- /dev/null +++ b/go/go.mod @@ -0,0 +1,5 @@ +module github.com/asg017/sqlite-vss/go + +go 1.20 + +require github.com/mattn/go-sqlite3 v1.14.16 // indirect diff --git a/go/go.sum b/go/go.sum new file mode 100644 index 0000000..7878efc --- /dev/null +++ b/go/go.sum @@ -0,0 +1,2 @@ +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= diff --git a/go/vss.go b/go/vss.go new file mode 100644 index 0000000..4c4fbab --- /dev/null +++ b/go/vss.go @@ -0,0 +1,20 @@ +package vss + +import ( + "database/sql" + "path" + + "github.com/mattn/go-sqlite3" +) + +// Open returns a sql.DB pre-configured with sqlite-vss extensions, +// to work vss0 and vector0 files should be stored under extPath. +func Open(dbName string, extPath string) (*sql.DB, error) { + sql.Register("sqlite-vss", &sqlite3.SQLiteDriver{ + Extensions: []string{ + path.Join(extPath, "vector0"), + path.Join(extPath, "vss0"), + }, + }) + return sql.Open("sqlite-vss", dbName) +}