123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- /*
- Package pq is a pure Go Postgres driver for the database/sql package.
- In most cases clients will use the database/sql package instead of
- using this package directly. For example:
- import (
- "database/sql"
- _ "github.com/lib/pq"
- )
- func main() {
- db, err := sql.Open("postgres", "user=pqgotest dbname=pqgotest sslmode=verify-full")
- if err != nil {
- log.Fatal(err)
- }
- age := 21
- rows, err := db.Query("SELECT name FROM users WHERE age = $1", age)
- …
- }
- You can also connect to a database using a URL. For example:
- db, err := sql.Open("postgres", "postgres://pqgotest:password@localhost/pqgotest?sslmode=verify-full")
- Connection String Parameters
- Similarly to libpq, when establishing a connection using pq you are expected to
- supply a connection string containing zero or more parameters.
- A subset of the connection parameters supported by libpq are also supported by pq.
- Additionally, pq also lets you specify run-time parameters (such as search_path or work_mem)
- directly in the connection string. This is different from libpq, which does not allow
- run-time parameters in the connection string, instead requiring you to supply
- them in the options parameter.
- For compatibility with libpq, the following special connection parameters are
- supported:
- * dbname - The name of the database to connect to
- * user - The user to sign in as
- * password - The user's password
- * host - The host to connect to. Values that start with / are for unix domain sockets. (default is localhost)
- * port - The port to bind to. (default is 5432)
- * sslmode - Whether or not to use SSL (default is require, this is not the default for libpq)
- * fallback_application_name - An application_name to fall back to if one isn't provided.
- * connect_timeout - Maximum wait for connection, in seconds. Zero or not specified means wait indefinitely.
- * sslcert - Cert file location. The file must contain PEM encoded data.
- * sslkey - Key file location. The file must contain PEM encoded data.
- * sslrootcert - The location of the root certificate file. The file must contain PEM encoded data.
- Valid values for sslmode are:
- * disable - No SSL
- * require - Always SSL (skip verification)
- * verify-ca - Always SSL (verify that the certificate presented by the server was signed by a trusted CA)
- * verify-full - Always SSL (verify that the certification presented by the server was signed by a trusted CA and the server host name matches the one in the certificate)
- See http://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING
- for more information about connection string parameters.
- Use single quotes for values that contain whitespace:
- "user=pqgotest password='with spaces'"
- A backslash will escape the next character in values:
- "user=space\ man password='it\'s valid'
- Note that the connection parameter client_encoding (which sets the
- text encoding for the connection) may be set but must be "UTF8",
- matching with the same rules as Postgres. It is an error to provide
- any other value.
- In addition to the parameters listed above, any run-time parameter that can be
- set at backend start time can be set in the connection string. For more
- information, see
- http://www.postgresql.org/docs/current/static/runtime-config.html.
- Most environment variables as specified at http://www.postgresql.org/docs/current/static/libpq-envars.html
- supported by libpq are also supported by pq. If any of the environment
- variables not supported by pq are set, pq will panic during connection
- establishment. Environment variables have a lower precedence than explicitly
- provided connection parameters.
- The pgpass mechanism as described in http://www.postgresql.org/docs/current/static/libpq-pgpass.html
- is supported, but on Windows PGPASSFILE must be specified explicitly.
- Queries
- database/sql does not dictate any specific format for parameter
- markers in query strings, and pq uses the Postgres-native ordinal markers,
- as shown above. The same marker can be reused for the same parameter:
- rows, err := db.Query(`SELECT name FROM users WHERE favorite_fruit = $1
- OR age BETWEEN $2 AND $2 + 3`, "orange", 64)
- pq does not support the LastInsertId() method of the Result type in database/sql.
- To return the identifier of an INSERT (or UPDATE or DELETE), use the Postgres
- RETURNING clause with a standard Query or QueryRow call:
- var userid int
- err := db.QueryRow(`INSERT INTO users(name, favorite_fruit, age)
- VALUES('beatrice', 'starfruit', 93) RETURNING id`).Scan(&userid)
- For more details on RETURNING, see the Postgres documentation:
- http://www.postgresql.org/docs/current/static/sql-insert.html
- http://www.postgresql.org/docs/current/static/sql-update.html
- http://www.postgresql.org/docs/current/static/sql-delete.html
- For additional instructions on querying see the documentation for the database/sql package.
- Data Types
- Parameters pass through driver.DefaultParameterConverter before they are handled
- by this package. When the binary_parameters connection option is enabled,
- []byte values are sent directly to the backend as data in binary format.
- This package returns the following types for values from the PostgreSQL backend:
- - integer types smallint, integer, and bigint are returned as int64
- - floating-point types real and double precision are returned as float64
- - character types char, varchar, and text are returned as string
- - temporal types date, time, timetz, timestamp, and timestamptz are returned as time.Time
- - the boolean type is returned as bool
- - the bytea type is returned as []byte
- All other types are returned directly from the backend as []byte values in text format.
- Errors
- pq may return errors of type *pq.Error which can be interrogated for error details:
- if err, ok := err.(*pq.Error); ok {
- fmt.Println("pq error:", err.Code.Name())
- }
- See the pq.Error type for details.
- Bulk imports
- You can perform bulk imports by preparing a statement returned by pq.CopyIn (or
- pq.CopyInSchema) in an explicit transaction (sql.Tx). The returned statement
- handle can then be repeatedly "executed" to copy data into the target table.
- After all data has been processed you should call Exec() once with no arguments
- to flush all buffered data. Any call to Exec() might return an error which
- should be handled appropriately, but because of the internal buffering an error
- returned by Exec() might not be related to the data passed in the call that
- failed.
- CopyIn uses COPY FROM internally. It is not possible to COPY outside of an
- explicit transaction in pq.
- Usage example:
- txn, err := db.Begin()
- if err != nil {
- log.Fatal(err)
- }
- stmt, err := txn.Prepare(pq.CopyIn("users", "name", "age"))
- if err != nil {
- log.Fatal(err)
- }
- for _, user := range users {
- _, err = stmt.Exec(user.Name, int64(user.Age))
- if err != nil {
- log.Fatal(err)
- }
- }
- _, err = stmt.Exec()
- if err != nil {
- log.Fatal(err)
- }
- err = stmt.Close()
- if err != nil {
- log.Fatal(err)
- }
- err = txn.Commit()
- if err != nil {
- log.Fatal(err)
- }
- Notifications
- PostgreSQL supports a simple publish/subscribe model over database
- connections. See http://www.postgresql.org/docs/current/static/sql-notify.html
- for more information about the general mechanism.
- To start listening for notifications, you first have to open a new connection
- to the database by calling NewListener. This connection can not be used for
- anything other than LISTEN / NOTIFY. Calling Listen will open a "notification
- channel"; once a notification channel is open, a notification generated on that
- channel will effect a send on the Listener.Notify channel. A notification
- channel will remain open until Unlisten is called, though connection loss might
- result in some notifications being lost. To solve this problem, Listener sends
- a nil pointer over the Notify channel any time the connection is re-established
- following a connection loss. The application can get information about the
- state of the underlying connection by setting an event callback in the call to
- NewListener.
- A single Listener can safely be used from concurrent goroutines, which means
- that there is often no need to create more than one Listener in your
- application. However, a Listener is always connected to a single database, so
- you will need to create a new Listener instance for every database you want to
- receive notifications in.
- The channel name in both Listen and Unlisten is case sensitive, and can contain
- any characters legal in an identifier (see
- http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
- for more information). Note that the channel name will be truncated to 63
- bytes by the PostgreSQL server.
- You can find a complete, working example of Listener usage at
- http://godoc.org/github.com/lib/pq/listen_example.
- */
- package pq
|