v2.1.1+incompatible Latest Latest

This package is not in the latest version of its module.

Go to latest
Published: May 22, 2017 License: BSD-3-Clause Imports: 15 Imported by: 0



This is the Go SQL driver for Vitess.

Vitess is an SQL middleware which turns MySQL/MariaDB into a fast, scalable and highly-available distributed database. For more information, visit


For more information on this driver, please see its godoc page:


go get

See the documentation link above for examples.



Package vitessdriver contains the Vitess Go SQL driver.


Vitess is an SQL middleware which turns MySQL/MariaDB into a fast, scalable and highly-available distributed database. For more information, visit


Using this SQL driver is as simple as:

import (

func main() {
  // Connect to vtgate.
  db, err := vitessdriver.Open("localhost:15991", "keyspace", "master", 30*time.Second)

  // Use "db" via the Golang sql interface.

For a full example, please see:

The full example is based on our tutorial for running Vitess locally:


This driver connects to a vtgate process. In Vitess, vtgate is a proxy server that routes queries to the appropriate shards.

By decoupling the routing logic from the application, vtgate enables Vitess features like consistent, application-transparent resharding: When you scale up the number of shards, vtgate becomes aware of the new shards. You do not have to update your application at all.

VTGate is capable of breaking up your query into parts, routing them to the appropriate shards and combining the results, thereby giving the semblance of a unified database.

The driver uses the V3 API which doesn't require you to specify routing information. You just send the query as if Vitess was a regular database. VTGate analyzes the query and uses additional metadata called VSchema to perform the necessary routing. See the vtgate v3 Features doc for an overview:

As of 12/2015, the VSchema creation is not documented yet as we are in the process of simplifying the VSchema definition and the overall process for creating one. If you want to create your own VSchema, we recommend to have a look at the VSchema from the vtgate v3 demo:

(The demo itself is interactive and can be run by executing "./" in the "examples/demo/" directory.)

The vtgate v3 design doc, which we will also update and simplify in the future, contains more details on the VSchema:

Isolation levels

The Vitess isolation model is different from the one exposed by a traditional database. Isolation levels are controlled by connection parameters instead of Go's IsolationLevel. You can perform master, replica or rdonly reads. Master reads give you read-after-write consistency. Replica and rdonly reads give you eventual consistency. Replica reads are for satisfying OLTP workloads while rdonly is for OLAP.

All transactions must be sent to the master where writes are allowed. Replica and rdonly reads can only be performed outside of a transaction. So, there is no concept of a read-only transaction in Vitess.

Consequently, no IsolationLevel must be specified while calling BeginContext. Doing so will result in an error.

Named arguments

Vitess supports positional or named arguments. However, intermixing is not allowed within a statement. If using named arguments, the ':' and '@' prefixes are optional. If they're specified, the driver will strip them off before sending the request over to VTGate.



View Source
const (
	// AtomicityMulti is the default level. It allows distributed transactions
	// with best effort commits. Partial commits are possible.
	AtomicityMulti = vtgateconn.AtomicityMulti
	// AtomicitySingle prevents a transaction from crossing the boundary of
	// a single database.
	AtomicitySingle = vtgateconn.AtomicitySingle
	// Atomicity2PC allows distributed transactions, and performs 2PC commits.
	Atomicity2PC = vtgateconn.Atomicity2PC

These are synonyms of the constants defined in vtgateconn.


This section is empty.


func AtomicityFromContext

func AtomicityFromContext(ctx context.Context) vtgateconn.Atomicity

AtomicityFromContext returns the atomicity of the context.

func Open

func Open(address, keyspace, tabletType string, timeout time.Duration) (*sql.DB, error)

Open is a Vitess helper function for sql.Open().

It opens a database connection to vtgate running at "address".

Note that this is the vtgate v3 mode and requires a loaded VSchema.

func OpenForStreaming

func OpenForStreaming(address, keyspace, tabletType string, timeout time.Duration) (*sql.DB, error)

OpenForStreaming is the same as Open() but uses streaming RPCs to retrieve the results.

The streaming mode is recommended for large results.

func OpenWithConfiguration

func OpenWithConfiguration(c Configuration) (*sql.DB, error)

OpenWithConfiguration is the generic Vitess helper function for sql.Open().

It allows to pass in a Configuration struct to control all possible settings of the Vitess Go SQL driver.

func WithAtomicity

func WithAtomicity(ctx context.Context, level vtgateconn.Atomicity) context.Context

WithAtomicity returns a context with the atomicity level set.


type Configuration

type Configuration struct {
	// Protocol is the name of the vtgate RPC client implementation.
	// Note: In open-source "grpc" is the recommended implementation.
	// Default: "grpc"
	Protocol string

	// Address must point to a vtgate instance.
	// Format: hostname:port
	Address string

	// Keyspace specifies the default keyspace.
	Keyspace string

	// TabletType is the type of tablet you want to access and affects the
	// freshness of read data.
	// For example, "replica" means eventually consistent reads, while
	// "master" supports transactions and gives you read-after-write consistency.
	// Default: "master"
	// Allowed values: "master", "replica", "rdonly"
	TabletType string `json:"tablet_type"`

	// Streaming is true when streaming RPCs are used.
	// Recommended for large results.
	// Default: false
	Streaming bool

	// Timeout after which a pending query will be aborted.
	// TODO(sougou): deprecate once we switch to go1.8.
	Timeout time.Duration

Configuration holds all Vitess driver settings.

Fields with documented default values do not have to be set explicitly.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL