limbo/bindings/go
2025-07-07 11:51:25 -03:00
..
libs change to address CI failure. libs dir must exist with at least one file during build time. Add libs/.gitkeep as placeholder. Update .gitignore to exclude built libs but keep placeholder. This change is for CI purposes only 2025-05-02 13:02:52 -07:00
rs_src make all run_once be run under statement or connection so that rollback is called 2025-07-07 11:51:25 -03:00
.gitignore change to address CI failure. libs dir must exist with at least one file during build time. Add libs/.gitkeep as placeholder. Update .gitignore to exclude built libs but keep placeholder. This change is for CI purposes only 2025-05-02 13:02:52 -07:00
build_lib.sh Merge branch 'main' into feature/go-transactions 2025-05-07 12:48:20 -07:00
Cargo.toml Rename limbo_core crate to turso_core 2025-06-29 09:59:17 +03:00
connection.go Bindings/Go: Fix symbols for rows + stmt getError FFI calls 2025-05-11 15:26:07 -04:00
embedded.go embeds and extracts platform-specific libraries at runtime using Go's embed package 2025-05-02 12:43:36 -07:00
go.mod Fix URLs to point to github.com/tursodatabase/turso 2025-06-30 11:23:53 +03:00
go.sum Bindings/Go: Upgrade ebitengine/purego to allow for use with go 1.23.9 2025-05-09 20:25:29 -04:00
limbo_test.go Fix URLs to point to github.com/tursodatabase/turso 2025-06-30 11:23:53 +03:00
limbo_unix.go Update library loading mechanism to first attempt using the embedded library before falling back to traditional LD_LIBRARY_PATH lookup 2025-05-02 12:44:24 -07:00
limbo_windows.go Update Windows library loading to prioritize the embedded library while maintaining compatibility with PATH-based lookup 2025-05-02 12:44:46 -07:00
README.md Fix URLs to point to github.com/tursodatabase/turso 2025-06-30 11:23:53 +03:00
rows.go bindings/go: Add error propagation from bindings lib 2025-02-02 07:40:28 -05:00
stmt.go bindings/go: Add error propagation from bindings lib 2025-02-02 07:40:28 -05:00
types.go Bindings/Go: Fix symbols for rows + stmt getError FFI calls 2025-05-11 15:26:07 -04:00

Limbo driver for Go's database/sql library

NOTE: this is currently heavily W.I.P and is not yet in a usable state.

This driver uses the awesome purego library to call C (in this case Rust with C ABI) functions from Go without the use of CGO.

Embedded Library Support

This driver includes an embedded library feature that allows you to distribute a single binary without requiring users to set environment variables. The library for your platform is automatically embedded, extracted at runtime, and loaded dynamically.

Building from Source

To build with embedded library support, follow these steps:

# Clone the repository
git clone https://github.com/tursodatabase/turso

# Navigate to the Go bindings directory
cd limbo/bindings/go

# Build the library (defaults to release build)
./build_lib.sh

# Alternatively, for faster builds during development:
./build_lib.sh debug

Build Options:

  • Release Build (default): ./build_lib.sh or ./build_lib.sh release

    • Optimized for performance and smaller binary size
    • Takes longer to compile and requires more system resources
    • Recommended for production use
  • Debug Build: ./build_lib.sh debug

    • Faster compilation times with less resource usage
    • Larger binary size and slower runtime performance
    • Recommended during development or if release build fails

If the embedded library cannot be found or extracted, the driver will fall back to the traditional method of finding the library in the system paths.

To use: (UNSTABLE testing or development purposes only)

Build the driver with the embedded library as described above, then simply import and use. No environment variables needed!

Option 2: Manual library setup

Linux | MacOS

All commands listed are relative to the bindings/go directory in the limbo repository

cargo build --package limbo-go

# Your LD_LIBRARY_PATH environment variable must include limbo's `target/debug` directory

export LD_LIBRARY_PATH="/path/to/limbo/target/debug:$LD_LIBRARY_PATH"

Windows

cargo build --package limbo-go

# You must add limbo's `target/debug` directory to your PATH
# or you could built + copy the .dll to a location in your PATH
# or just the CWD of your go module

cp path\to\limbo\target\debug\lib_limbo_go.dll .

go test

Temporarily you may have to clone the limbo repository and run:

go mod edit -replace github.com/tursodatabase/turso=/path/to/limbo/bindings/go

import (
    "fmt"
    "database/sql"
    _"github.com/tursodatabase/turso"
)

func main() {
	conn, err := sql.Open("sqlite3", ":memory:")
	if err != nil {
        fmt.Printf("Error: %v\n", err)
        os.Exit(1)
	}
    sql := "CREATE table go_limbo (foo INTEGER, bar TEXT)"
    _ = conn.Exec(sql)

    sql = "INSERT INTO go_limbo (foo, bar) values (?, ?)"
    stmt, _ := conn.Prepare(sql)
    defer stmt.Close()
    _  = stmt.Exec(42, "limbo")
    rows, _ := conn.Query("SELECT * from go_limbo")
    defer rows.Close()
    for rows.Next() {
        var a int
        var b string
		_ = rows.Scan(&a, &b)
        fmt.Printf("%d, %s", a, b)
    }
}

Implementation Notes

The embedded library feature was inspired by projects like go-embed-python, which uses a similar approach for embedding and distributing native libraries with Go applications.