PostgreSQL driver and toolkit for Go
 
 
 
Go to file
Jack Christensen d40d76c181 Update and simplify test instructions 2019-05-25 10:42:23 -05:00
examples Update url_shortener example 2019-05-17 14:13:03 -05:00
internal/sanitize Restore simple protocol support 2019-05-20 20:36:03 -05:00
log Fix go modules 2019-04-20 17:41:08 -05:00
pgmock Split pgtype into own repo 2019-04-20 19:20:00 -05:00
pool Improve pool Acquire / Release performance 2019-05-04 17:36:08 -05:00
stdlib Remove unnecessary internal function 2019-05-20 21:03:39 -05:00
travis Update and simplify test instructions 2019-05-25 10:42:23 -05:00
.gitignore Use environment variables for test configuration 2018-12-30 21:52:33 -06:00
.travis.yml Update and simplify test instructions 2019-05-25 10:42:23 -05:00
CHANGELOG.md Update changelog for v3.3.0 2018-12-01 11:13:13 -06:00
LICENSE Add license 2013-07-30 19:05:09 -05:00
README.md Update and simplify test instructions 2019-05-25 10:42:23 -05:00
batch.go Add SendBatch to pool 2019-04-25 15:07:35 -05:00
batch_test.go Add SendBatch to pool 2019-04-25 15:07:35 -05:00
bench-tmp_test.go Prepare takes context 2019-04-20 11:47:16 -05:00
bench_test.go Improve pool Acquire / Release performance 2019-05-04 17:36:08 -05:00
conn.go Restore simple protocol support 2019-05-20 20:36:03 -05:00
conn_test.go Restore simple protocol support 2019-05-20 20:36:03 -05:00
copy_from.go Use pgproto3.FieldDescription instead of pgx version 2019-05-04 13:47:18 -05:00
copy_from_test.go Add CopyFrom to pool 2019-04-25 15:35:53 -05:00
doc.go Commit and Rollback take context 2019-04-10 12:22:12 -05:00
example_custom_type_test.go Split pgtype into own repo 2019-04-20 19:20:00 -05:00
example_json_test.go Fix go modules 2019-04-20 17:41:08 -05:00
extended_query_builder.go Extract extendedQueryBuilder 2019-05-04 12:32:21 -05:00
go.mod Update url_shortener example 2019-05-17 14:13:03 -05:00
go.sum Update url_shortener example 2019-05-17 14:13:03 -05:00
go_stdlib.go Support nil pointers to value implementing driver.Valuer 2017-10-26 21:37:06 -04:00
helper_test.go Extract replication to pgxrepl package 2019-05-25 10:24:58 -05:00
large_objects.go Remove unused code 2019-05-11 11:50:50 -05:00
large_objects_test.go Large objects use context 2019-05-11 11:49:59 -05:00
logger.go Use golang.org/x/xerrors 2019-04-20 17:43:44 -05:00
messages.go Use pgproto3.FieldDescription instead of pgx version 2019-05-04 13:47:18 -05:00
query_test.go Restore simple protocol support 2019-05-20 20:36:03 -05:00
rows.go Restore simple protocol support 2019-05-20 20:36:03 -05:00
sql.go Cleanups 2016-08-30 20:05:44 +02:00
sql_test.go Fix go modules 2019-04-20 17:41:08 -05:00
stress_test.go Use golang.org/x/xerrors 2019-04-20 17:43:44 -05:00
tx.go Add CopyFrom to pool 2019-04-25 15:35:53 -05:00
tx_test.go Only have a single Begin transaction method 2019-04-24 13:35:27 -05:00
v4.md Add notes about error values 2019-04-11 17:53:27 -05:00
values.go Split pgtype into own repo 2019-04-20 19:20:00 -05:00
values_test.go Fix go modules 2019-04-20 17:41:08 -05:00

README.md

Build Status

pgx - PostgreSQL Driver and Toolkit

pgx is a pure Go driver and toolkit for PostgreSQL. pgx is different from other drivers such as pq because, while it can operate as a database/sql compatible driver, pgx is also usable directly. It offers a native interface similar to database/sql that offers better performance and more features.

var name string
var weight int64
err := conn.QueryRow("select name, weight from widgets where id=$1", 42).Scan(&name, &weight)
if err != nil {
    return err
}

Features

pgx supports many additional features beyond what is available through database/sql.

  • Support for approximately 60 different PostgreSQL types
  • Batch queries
  • Single-round trip query mode
  • Full TLS connection control
  • Binary format support for custom types (can be much faster)
  • Copy protocol support for faster bulk data loads
  • Extendable logging support including built-in support for log15 and logrus
  • Connection pool with after connect hook to do arbitrary connection setup
  • Listen / notify
  • PostgreSQL array to Go slice mapping for integers, floats, and strings
  • Hstore support
  • JSON and JSONB support
  • Maps inet and cidr PostgreSQL types to net.IPNet and net.IP
  • Large object support
  • NULL mapping to Null* struct or pointer to pointer.
  • Supports database/sql.Scanner and database/sql/driver.Valuer interfaces for custom types
  • Logical replication connections, including receiving WAL and sending standby status updates
  • Notice response handling (this is different than listen / notify)

Performance

pgx performs roughly equivalent to go-pg and is almost always faster than pq. When parsing large result sets the percentage difference can be significant (16483 queries/sec for pgx vs. 10106 queries/sec for pq -- 63% faster).

In many use cases a significant cause of latency is network round trips between the application and the server. pgx supports query batching to bundle multiple queries into a single round trip. Even in the case of a connection with the lowest possible latency, a local Unix domain socket, batching as few as three queries together can yield an improvement of 57%. With a typical network connection the results can be even more substantial.

See this gist for the underlying benchmark results or checkout go_db_bench to run tests for yourself.

In addition to the native driver, pgx also includes a number of packages that provide additional functionality.

github.com/jackc/pgx/stdlib

database/sql compatibility layer for pgx. pgx can be used as a normal database/sql driver, but at any time the native interface may be acquired for more performance or PostgreSQL specific functionality.

github.com/jackc/pgx/pgtype

Approximately 60 PostgreSQL types are supported including uuid, hstore, json, bytea, numeric, interval, inet, and arrays. These types support database/sql interfaces and are usable even outside of pgx. They are fully tested in pgx and pq. They also support a higher performance interface when used with the pgx driver.

github.com/jackc/pgproto3

pgproto3 provides standalone encoding and decoding of the PostgreSQL v3 wire protocol. This is useful for implementing very low level PostgreSQL tooling.

github.com/jackc/pgx/pgmock

pgmock offers the ability to create a server that mocks the PostgreSQL wire protocol. This is used internally to test pgx by purposely inducing unusual errors. pgproto3 and pgmock together provide most of the foundational tooling required to implement a PostgreSQL proxy or MitM (such as for a custom connection pooler).

Documentation

pgx includes extensive documentation in the godoc format. It is viewable online at godoc.org.

Testing

pgx tests need a PostgreSQL database. It will connect to the database specified in the PGX_TEST_DATABASE environment variable. The PGX_TEST_DATABASE environment variable can be a URL or DSN. In addition, the standard PG* environment variables will be respected. Consider using direnv to simplify environment variable handling.

Example Test Environment

Connect to your PostgreSQL server and run:

create database pgx_test;

Connect to the newly created database and run:

create domain uint64 as numeric(20,0);

Now you can run the tests:

PGX_TEST_DATABASE="host=/var/run/postgresql database=pgx_test" go test ./...

Version Policy

pgx follows semantic versioning for the documented public API on stable releases. Branch v3 is the latest stable release. master can contain new features or behavior that will change or be removed before being merged to the stable v3 branch (in practice, this occurs very rarely). v2 is the previous stable release.