Skip to content
Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

go-dqlite Build Status Coverage Status Go Report Card GoDoc

This repository provides the go-dqlite Go package, containing bindings for the dqlite C library and a pure-Go client for the dqlite wire protocol.


The best way to understand how to use the go-dqlite package is probably by looking at the source code of the demo program and use it as example.

In general your application will use code such as:

dir := "/path/to/data/directory"
address := "" // Unique node address
cluster := []string{...} // Optional list of existing nodes, when starting a new node
app, err := app.New(dir, app.WithAddress(address), app.WithCluster(cluster))
if err != nil {
        // ...

db, err := app.Open(context.Background(), "my-database")
if err != nil {
        // ...

// db is a *sql.DB object
if _, err := db.Exec("CREATE TABLE my_table (n INT)"); err != nil
        // ...


In order to use the go-dqlite package in your application, you'll need to have the dqlite C library installed on your system, along with its dependencies. You then need to pass the -tags argument to the Go tools when building or testing your packages, for example:

export CGO_LDFLAGS_ALLOW="-Wl,-z,now"
go build -tags libsqlite3
go test -tags libsqlite3


The documentation for this package can be found on Godoc.


To see dqlite in action, either install the Debian package from the PPA:

sudo add-apt-repository -y ppa:dqlite/dev
sudo apt install dqlite-tools libdqlite-dev

or build the dqlite C library and its dependencies from source, as described here, and then run:

go install -tags libsqlite3 ./cmd/dqlite-demo

from the top-level directory of this repository.

This builds a demo dqlite application, which exposes a simple key/value store over an HTTP API.

Once the dqlite-demo binary is installed (normally under ~/go/bin or /usr/bin/), start three nodes of the demo application:

dqlite-demo --api --db &
dqlite-demo --api --db --join &
dqlite-demo --api --db --join &

The --api flag tells the demo program where to expose its HTTP API.

The --db flag tells the demo program to use the given address for internal database replication.

The --join flag is optional and should be used only for additional nodes after the first one. It informs them about the existing cluster, so they can automatically join it.

Now we can start using the cluster. Let's insert a key pair:

curl -X PUT -d my-value

and then retrive it from the database:


Currently the first node is the leader. If we stop it and then try to query the key again curl will fail, but we can simply change the endpoint to another node and things will work since an automatic failover has taken place:

kill -TERM %1; curl


A basic SQLite-like dqlite shell is available in the dqlite-tools package or can be built with:

go install -tags libsqlite3 ./cmd/dqlite

You can test it with the dqlite-demo with:

dqlite -s

It supports normal SQL queries plus the special .cluster and .leader commands to inspect the cluster members and the current leader.