Common interface to CouchDB or CouchDB-like databases for Go and GopherJS
Go
345
3,736 commits
updated Sep 22, 2026
Package kivik provides a common interface to CouchDB or CouchDB-like databases.
The kivik package must be used in conjunction with a database driver.
The kivik driver system is modeled after the standard library's database/sql and sql/driver packages, although the client API is completely different due to the different database models implemented by SQL and NoSQL databases such as CouchDB.
You are browsing the current stable branch of Kivik, v4. The current version requires Go 1.20 or newer.
Example configuration for common dependency managers follow.
Install Kivik as you normally would for any Go package:
go get -u github.com/go-kivik/kivik/v4
This will install the main Kivik package and the CouchDB database driver. Three officially supported drivers are shipped with this Go module:
In addition, there are partial/experimental drivers available:
Consult the CLI README for full details on the kivik CLI tool.
Please consult the the package documentation for all available API methods, and a complete usage documentation, and usage examples.
package main
import (
"context"
"fmt"
kivik "github.com/go-kivik/kivik/v4"
_ "github.com/go-kivik/kivik/v4/couchdb" // The CouchDB driver
)
func main() {
client, err := kivik.New("couch", "http://localhost:5984/")
if err != nil {
panic(err)
}
db := client.DB("animals")
doc := map[string]interface{}{
"_id": "cow",
"feet": 4,
"greeting": "moo",
}
rev, err := db.Put(context.TODO(), "cow", doc)
if err != nil {
panic(err)
}
fmt.Printf("Cow inserted with revision %s\n", rev)
}
Nobody has ever asked me any of these questions, so they're probably better called "Never Asked Questions" or possibly "Imagined Questions."
I had a number of specific design goals when creating this package:
kivik/driver interfaces) vs the implementation of all the user-level types and convenience methods. It ought to be reasonably easy to create a new driver, for testing, mocking, implementing a new backend data storage system, or talking to other CouchDB-like databases.Kivik's test suite is automatically run on Linux for every pull request, but should work on all supported Go architectures. If you find it not working for your OS/architecture, please submit a bug report.
Below are the compatibility targets for specific runtime and database versions. If you discover a bug affecting any of these supported environments, please let me know by submitting a bug report via GitHub.
Kivik 4.x is stable, and suitable for production use.
Kivik is a line of sofas (couches) from IKEA. And in the spirit of IKEA, and build-your-own furniture, Kivik aims to allow you to "build your own" CouchDB client, server, and proxy applications.
Kivik is Copyright 2017-2023 by the Kivik contributors, and is released under the terms of the Apache 2.0 license. See LICENCE for the full text of the license.
This is a partial list of breaking changes between 3.x and 4.x
map[string]interface{}, but are rather functional parameters. In most cases, you can just use kivik.Param(key, value), or kivik.Params(map[string]interface{}{key: value}) as a replacement. Some shortcuts for common params now exist, and driver-specific options may work differently. Consult the GoDoc.Authenticate method has been removed. Authentication is now handled via option parameters.github.com/go-kivik/couchdb/v3, for example. With v4, you instead use github.com/go-kivik/kivik/v4/couchdb for CouchDB, or github.com/go-kivik/kivik/v4/x/fsdb for the experimental FilesystemDB driver.*Rows struct. Now they return a *ResultSet.Offset(), TotalRows(), UpdateSeq(), Warning() and Bookmark() methods have been removed, and replaced with the ResultMetadata type which is accessed via the Metadata() method. See issue #552.ResultSet will now work after closing the iterator.ResultSet type supports multi-query mode, which is triggered by calling NextResultSet before Next.Key, ID, Rev, Attachments all now return row-specific errors, and ScanKey may successfully decode while also returning a row-specific error.Changes type has been changed to semantically match the ResultSet type. Specifically, the LastSeq() and Pending() methods have been replaced by the Metadata() method.DBUpdates() and Changes() methods now defer errors to the iterator, for easier chaining and consistency with other iterators.DB.BulkDocs() no longer returns an iterator, but rather an array of all results.Get now returns a simpler *Result type than before.GetMeta has been replaced with GetRev, and no longer claims to return the document size. The document size was never really the document size, rather it is the Content-Length field of the HTTP response, which can vary depending on query parameters, making its use for determining document size dubious at best.StatusCode() int method on errors has been renamed to HTTPStatus() int, to be more descriptive. The related package function StatusCode(error) int has also been renamed to HTTPStatus(error) int to match.Client.Close() and DB.Close() now block until any relevant calls have returned.Client.Close() and DB.Close() no longer take a context.Context value. These operations cannot actually be canceled anyway, by the one driver that uses them (PouchDB); it only stops waiting. It makes more senes to make these functions blocking indefinitely, especially now that they wait for client requests to finish, and let the caller stop waiting if it wants to.SetTransport authentication method has been removed, as a duplicate of couchdb.OptionHTTPClient.kivik command line tool (previously part of the github.com/go-kivik/xkivik repository).If your project uses Kivik, and you'd like to be added to this list, create an issue or submit a pull request.
Overall
Maintained
Code review
Go module
Latest release
Releases this year
607 followers · starred Jul 2019
216 followers · starred Jan 2020
145 followers · starred Sep 2020
23 followers · starred Jun 2018
Common interface to CouchDB or CouchDB-like databases for Go and GopherJS
Go
345
3,736 commits
updated Sep 22, 2026
Package kivik provides a common interface to CouchDB or CouchDB-like databases.
The kivik package must be used in conjunction with a database driver.
The kivik driver system is modeled after the standard library's database/sql and sql/driver packages, although the client API is completely different due to the different database models implemented by SQL and NoSQL databases such as CouchDB.
You are browsing the current stable branch of Kivik, v4. The current version requires Go 1.20 or newer.
Example configuration for common dependency managers follow.
Install Kivik as you normally would for any Go package:
go get -u github.com/go-kivik/kivik/v4
This will install the main Kivik package and the CouchDB database driver. Three officially supported drivers are shipped with this Go module:
In addition, there are partial/experimental drivers available:
Consult the CLI README for full details on the kivik CLI tool.
Please consult the the package documentation for all available API methods, and a complete usage documentation, and usage examples.
package main
import (
"context"
"fmt"
kivik "github.com/go-kivik/kivik/v4"
_ "github.com/go-kivik/kivik/v4/couchdb" // The CouchDB driver
)
func main() {
client, err := kivik.New("couch", "http://localhost:5984/")
if err != nil {
panic(err)
}
db := client.DB("animals")
doc := map[string]interface{}{
"_id": "cow",
"feet": 4,
"greeting": "moo",
}
rev, err := db.Put(context.TODO(), "cow", doc)
if err != nil {
panic(err)
}
fmt.Printf("Cow inserted with revision %s\n", rev)
}
Nobody has ever asked me any of these questions, so they're probably better called "Never Asked Questions" or possibly "Imagined Questions."
I had a number of specific design goals when creating this package:
kivik/driver interfaces) vs the implementation of all the user-level types and convenience methods. It ought to be reasonably easy to create a new driver, for testing, mocking, implementing a new backend data storage system, or talking to other CouchDB-like databases.Kivik's test suite is automatically run on Linux for every pull request, but should work on all supported Go architectures. If you find it not working for your OS/architecture, please submit a bug report.
Below are the compatibility targets for specific runtime and database versions. If you discover a bug affecting any of these supported environments, please let me know by submitting a bug report via GitHub.
Kivik 4.x is stable, and suitable for production use.
Kivik is a line of sofas (couches) from IKEA. And in the spirit of IKEA, and build-your-own furniture, Kivik aims to allow you to "build your own" CouchDB client, server, and proxy applications.
Kivik is Copyright 2017-2023 by the Kivik contributors, and is released under the terms of the Apache 2.0 license. See LICENCE for the full text of the license.
This is a partial list of breaking changes between 3.x and 4.x
map[string]interface{}, but are rather functional parameters. In most cases, you can just use kivik.Param(key, value), or kivik.Params(map[string]interface{}{key: value}) as a replacement. Some shortcuts for common params now exist, and driver-specific options may work differently. Consult the GoDoc.Authenticate method has been removed. Authentication is now handled via option parameters.github.com/go-kivik/couchdb/v3, for example. With v4, you instead use github.com/go-kivik/kivik/v4/couchdb for CouchDB, or github.com/go-kivik/kivik/v4/x/fsdb for the experimental FilesystemDB driver.*Rows struct. Now they return a *ResultSet.Offset(), TotalRows(), UpdateSeq(), Warning() and Bookmark() methods have been removed, and replaced with the ResultMetadata type which is accessed via the Metadata() method. See issue #552.ResultSet will now work after closing the iterator.ResultSet type supports multi-query mode, which is triggered by calling NextResultSet before Next.Key, ID, Rev, Attachments all now return row-specific errors, and ScanKey may successfully decode while also returning a row-specific error.Changes type has been changed to semantically match the ResultSet type. Specifically, the LastSeq() and Pending() methods have been replaced by the Metadata() method.DBUpdates() and Changes() methods now defer errors to the iterator, for easier chaining and consistency with other iterators.DB.BulkDocs() no longer returns an iterator, but rather an array of all results.Get now returns a simpler *Result type than before.GetMeta has been replaced with GetRev, and no longer claims to return the document size. The document size was never really the document size, rather it is the Content-Length field of the HTTP response, which can vary depending on query parameters, making its use for determining document size dubious at best.StatusCode() int method on errors has been renamed to HTTPStatus() int, to be more descriptive. The related package function StatusCode(error) int has also been renamed to HTTPStatus(error) int to match.Client.Close() and DB.Close() now block until any relevant calls have returned.Client.Close() and DB.Close() no longer take a context.Context value. These operations cannot actually be canceled anyway, by the one driver that uses them (PouchDB); it only stops waiting. It makes more senes to make these functions blocking indefinitely, especially now that they wait for client requests to finish, and let the caller stop waiting if it wants to.SetTransport authentication method has been removed, as a duplicate of couchdb.OptionHTTPClient.kivik command line tool (previously part of the github.com/go-kivik/xkivik repository).If your project uses Kivik, and you'd like to be added to this list, create an issue or submit a pull request.
Overall
Maintained
Code review
Go module
Latest release
Releases this year
607 followers · starred Jul 2019
216 followers · starred Jan 2020
145 followers · starred Sep 2020
23 followers · starred Jun 2018