Categorygithub.com/steampunkcoder/pgx
modulepackage
3.1.0+incompatible
Repository: https://github.com/steampunkcoder/pgx.git
Documentation: pkg.go.dev

# README

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/pgx/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 supports multiple connection and authentication types. Setting up a test environment that can test all of them can be cumbersome. In particular, Windows cannot test Unix domain socket connections. Because of this pgx will skip tests for connection types that are not configured.

Normal Test Environment

To setup the normal test environment, first install these dependencies:

go get github.com/cockroachdb/apd
go get github.com/hashicorp/go-version
go get github.com/jackc/fake
go get github.com/lib/pq
go get github.com/pkg/errors
go get github.com/satori/go.uuid
go get github.com/shopspring/decimal
go get github.com/sirupsen/logrus
go get go.uber.org/zap
go get gopkg.in/inconshreveable/log15.v2

Then run the following SQL:

create user pgx_md5 password 'secret';
create user " tricky, ' } "" \ test user " password 'secret';
create database pgx_test;
create user pgx_replication with replication password 'secret';

Connect to database pgx_test and run:

create extension hstore;

Next open conn_config_test.go.example and make a copy without the .example. If your PostgreSQL server is accepting connections on 127.0.0.1, then you are done.

Connection and Authentication Test Environment

Complete the normal test environment setup and also do the following.

Run the following SQL:

create user pgx_none;
create user pgx_pw password 'secret';

Add the following to your pg_hba.conf:

If you are developing on Unix with domain socket connections:

local  pgx_test  pgx_none  trust
local  pgx_test  pgx_pw    password
local  pgx_test  pgx_md5   md5

If you are developing on Windows with TCP connections:

host  pgx_test  pgx_none  127.0.0.1/32 trust
host  pgx_test  pgx_pw    127.0.0.1/32 password
host  pgx_test  pgx_md5   127.0.0.1/32 md5

Replication Test Environment

Add a replication user:

create user pgx_replication with replication password 'secret';

Add a replication line to your pg_hba.conf:

host replication pgx_replication 127.0.0.1/32 md5

Change the following settings in your postgresql.conf:

wal_level=logical
max_wal_senders=5
max_replication_slots=5

Set replicationConnConfig appropriately in conn_config_test.go.

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.

# Packages

No description provided by the author
No description provided by the author
No description provided by the author
Package pgio is a low-level toolkit building messages in the PostgreSQL wire protocol.
No description provided by the author
No description provided by the author
No description provided by the author
Package stdlib is the compatibility layer from pgx to database/sql.

# Functions

Connect establishes a connection with a PostgreSQL server using config.
CopyFromRows returns a CopyFromSource interface over the provided rows slice making it usable by *Conn.CopyFrom.
Format the given 64bit LSN value into the XXX/XXX format, which is the format reported by postgres.
LogLevelFromString converts log level string to constant Valid levels: trace debug info warn error none.
NewConnPool creates a new ConnPool.
Create a standby status struct, which sets all the WAL positions to the given wal position, and the client time to the current time.
ParseConnectionString parses either a URI or a DSN connection string.
ParseDSN parses a database DSN (data source name) into a ConnConfig e.g.
ParseEnvLibpq parses the environment like libpq does into a ConnConfig See http://www.postgresql.org/docs/9.4/static/libpq-envars.html for details on the meaning of environment variables.
Parse the given XXX/XXX format LSN as reported by postgres, into a 64 bit integer as used internally by the wire procotols.
ParseURI parses a database URI into ConnConfig Query parameters not used by the connection process are parsed into ConnConfig.RuntimeParams.
No description provided by the author

# Constants

PostgreSQL format codes.
Transaction deferrable modes.
No description provided by the author
No description provided by the author
The values for log levels are chosen such that the zero value means that no log level was specified.
The values for log levels are chosen such that the zero value means that no log level was specified.
The values for log levels are chosen such that the zero value means that no log level was specified.
The values for log levels are chosen such that the zero value means that no log level was specified.
The values for log levels are chosen such that the zero value means that no log level was specified.
The values for log levels are chosen such that the zero value means that no log level was specified.
Transaction deferrable modes.
Transaction isolation levels.
Transaction access modes.
Transaction isolation levels.
Transaction access modes.
Transaction isolation levels.
Transaction isolation levels.
PostgreSQL format codes.
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author

# Variables

ErrAcquireTimeout occurs when an attempt to acquire a connection times out.
ErrClosedPool occurs on an attempt to acquire a connection from a closed pool.
ErrConnBusy occurs when the connection is busy (for example, in the middle of reading query results) and another action is attempted.
ErrDeadConn occurs on an attempt to use a dead connection.
ErrInvalidLogLevel occurs on attempt to set an invalid log level.
ErrNoRows occurs when rows are expected but none are returned.
ErrTLSRefused occurs when the connection attempt requires TLS and the PostgreSQL server refuses to use TLS.
No description provided by the author
ErrTxCommitRollback occurs when an error has occurred in a transaction and Commit() is called.

# Structs

Batch queries are a way of bundling multiple queries together to avoid unnecessary network round trips.
Conn is a PostgreSQL connection handle.
ConnConfig contains all the options used to establish a connection.
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
A LargeObject is a large object stored on the server.
LargeObjects is a structure used to access the large objects API.
Notification is a message received from the PostgreSQL LISTEN/NOTIFY system.
PgError represents an error reported by the PostgreSQL server.
PreparedStatement is a description of a prepared statement.
PrepareExOptions is an option struct that can be passed to PrepareEx.
No description provided by the author
No description provided by the author
The replication message wraps all possible messages from the server received during replication.
Rows is the result set returned from *Conn.Query.
The server heartbeat is sent periodically from the server, including server status, and a reply request field.
The standby status is the client side heartbeat sent to the postgresql server to track the client wal positions.
Tx represents a database transaction.
No description provided by the author
The WAL message contains WAL payload entry data.

# Interfaces

CopyFromSource is the interface used by *Conn.CopyFrom as the source for copy data.
Logger is the interface used to get logging from pgx internals.

# Type aliases

CommandTag is the result of an Exec function.
DialFunc is a function that can be used to connect to a PostgreSQL server.
Identifier a PostgreSQL identifier or name.
No description provided by the author
LogLevel represents the pgx logging level.
Notice represents a notice response message reported by the PostgreSQL server.
NoticeHandler is a function that can handle notices received from the PostgreSQL server.
ProtocolError occurs when unexpected data is received from PostgreSQL.
QueryArgs is a container for arguments to an SQL query.
Row is a convenience wrapper over Rows that is returned by QueryRow.
SerializationError occurs on failure to encode or decode a value.
No description provided by the author
No description provided by the author
No description provided by the author