_dns – DNS resolution utilities

This module contains a few experimental utilities to interact wit the DNS server before performing a connection.

Warning

This module is experimental and its interface could change in the future, without warning or respect for the version scheme. It is provided here to allow experimentation before making it more stable.

Warning

This module depends on the dnspython package. The package is currently not installed automatically as a Psycopg dependency and must be installed manually:

$ pip install "dnspython >= 2.1"
async psycopg._dns.resolve_hostaddr_async(params)

Perform async DNS lookup of the hosts and return a new params dict.

Parameters

params (Dict[str, Any]) – The input parameters, for instance as returned by conninfo_to_dict().

If a host param is present but not hostname, resolve the host addresses dynamically.

The function may change the input host, hostname, port to allow to connect without further DNS lookups, eventually removing hosts that are not resolved, keeping the lists of hosts and ports consistent.

Raise OperationalError if connection is not possible (e.g. no host resolve, inconsistent lists length).

See the PostgreSQL docs for explanation of how these params are used, and how they support multiple entries.

Warning

This function currently doesn’t handle the /etc/hosts file.

Return type

Dict[str, Any]

Note

One possible way to use this function automatically is to subclass AsyncConnection, extending the _get_connection_params() method:

import psycopg._dns  # not imported automatically

class AsyncDnsConnection(psycopg.AsyncConnection):
    @classmethod
    async def _get_connection_params(cls, conninfo, **kwargs):
        params = await super()._get_connection_params(conninfo, **kwargs)
        params = await psycopg._dns.resolve_hostaddr_async(params)
        return params
psycopg._dns.resolve_srv(params)

Apply SRV DNS lookup as defined in RFC 2782.

Parameters

params (Dict[str, Any]) – The input parameters, for instance as returned by conninfo_to_dict().

Return type

Dict[str, Any]

Returns

An updated list of connection parameters.

For every host defined in the params["host"] list (comma-separated), perform SRV lookup if the host is in the form _Service._Proto.Target. If lookup is successful, return a params dict with hosts and ports replaced with the looked-up entries.

Raise OperationalError if no lookup is successful and no host (looked up or unchanged) could be returned.

In addition to the rules defined by RFC 2782 about the host name pattern, perform SRV lookup also if the the port is the string SRV (case insensitive).

Warning

This is an experimental functionality.

Note

One possible way to use this function automatically is to subclass Connection, extending the _get_connection_params() method:

import psycopg._dns  # not imported automatically

class SrvCognizantConnection(psycopg.Connection):
    @classmethod
    def _get_connection_params(cls, conninfo, **kwargs):
        params = super()._get_connection_params(conninfo, **kwargs)
        params = psycopg._dns.resolve_srv(params)
        return params

# The name will be resolved to db1.example.com
cnn = SrvCognizantConnection.connect("host=_postgres._tcp.db.psycopg.org")
async psycopg._dns.resolve_srv_async(params)

Async equivalent of resolve_srv().

Return type

Dict[str, Any]

classmethod Connection._get_connection_params(conninfo, **kwargs)

Manipulate connection parameters before connecting.

Parameters
  • conninfo (str) – Connection string as received by connect().

  • kwargs (Any) – Overriding connection arguments as received by connect().

Return type

Dict[str, Any]

Returns

Connection arguments merged and eventually modified, in a format similar to conninfo_to_dict().

Warning

This is an experimental method.

This method is a subclass hook allowing to manipulate the connection parameters before performing the connection. Make sure to call the super() implementation before further manipulation of the arguments:

@classmethod
def _get_connection_params(cls, conninfo, **kwargs):
    params = super()._get_connection_params(conninfo, **kwargs)
    # do something with the params
    return params
async classmethod AsyncConnection._get_connection_params(conninfo, **kwargs)

Manipulate connection parameters before connecting.

Return type

Dict[str, Any]

Warning

This is an experimental method.