summaryrefslogtreecommitdiff
path: root/doc/src/install.rst
blob: 2c7bdf27340fe89ba9a4acaadd0a0982a085dff6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
.. _installation:

Installation
============

.. sectionauthor:: Daniele Varrazzo <daniele.varrazzo@gmail.com>

Psycopg is a PostgreSQL_ adapter for the Python_ programming language. It is a
wrapper for the libpq_, the official PostgreSQL client library.

.. _PostgreSQL: https://www.postgresql.org/
.. _Python: https://www.python.org/


.. index::
    single: Install; from PyPI
    single: Install; wheel
    single: Wheel

.. _binary-packages:

Quick Install
-------------

For most operating systems, the quickest way to install Psycopg is using the
wheel_ package available on PyPI_:

.. code-block:: console

    $ pip install psycopg2-binary

This will install a pre-compiled binary version of the module which does not
require the build or runtime prerequisites described below. Make sure to use
an up-date-date version of :program:`pip` (you can upgrade it using something
like ``pip install -U pip``).

You may then import the ``psycopg2`` package, as usual:

.. code-block:: python

    import psycopg2

    # Connect to your postgres DB
    conn = psycopg2.connect("dbname=test user=postgres")

    # Open a cursor to perform database operations
    cur = conn.cursor()

    # Execute a query
    cur.execute("SELECT * FROM my_data")

    # Retrieve query results
    records = cur.fetchall()

.. _PyPI: https://pypi.org/project/psycopg2-binary/
.. _wheel: https://pythonwheels.com/


psycopg vs psycopg-binary
^^^^^^^^^^^^^^^^^^^^^^^^^

The ``psycopg2-binary`` package is meant for beginners to start playing
with Python and PostgreSQL without the need to meet the build
requirements.

If you are the maintainer of a published package depending on `!psycopg2`
you shouldn't use ``psycopg2-binary`` as a module dependency. **For
production use you are advised to use the source distribution.**

The binary packages come with their own versions of a few C libraries,
among which ``libpq`` and ``libssl``, which will be used regardless of other
libraries available on the client: upgrading the system libraries will not
upgrade the libraries used by `!psycopg2`. Please build `!psycopg2` from
source if you want to maintain binary upgradeability.

.. warning::

    The `!psycopg2` wheel package comes packaged, among the others, with its
    own ``libssl`` binary. This may create conflicts with other extension
    modules binding with ``libssl`` as well, for instance with the Python
    `ssl` module: in some cases, under concurrency, the interaction between
    the two libraries may result in a segfault. In case of doubts you are
    advised to use a package built from source.


.. index::
    single: Install; disable wheel
    single: Wheel; disable

.. _disable-wheel:

Change in binary packages between Psycopg 2.7 and 2.8
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In version 2.7.x, :command:`pip install psycopg2` would have tried to install
automatically the binary package of Psycopg. Because of concurrency problems
binary packages have displayed, ``psycopg2-binary`` has become a separate
package, and from 2.8 it has become the only way to install the binary
package.

If you are using Psycopg 2.7 and you want to disable the use of wheel binary
packages, relying on the system libraries available on your client, you
can use the :command:`pip` |--no-binary option|__, e.g.:

.. code-block:: console

    $ pip install --no-binary :all: psycopg2

.. |--no-binary option| replace:: ``--no-binary`` option
.. __: https://pip.pypa.io/en/stable/reference/pip_install/#install-no-binary

which can be specified in your :file:`requirements.txt` files too, e.g. use:

.. code-block:: none

    psycopg2>=2.7,<2.8 --no-binary psycopg2

to use the last bugfix release of the `!psycopg2` 2.7 package, specifying to
always compile it from source. Of course in this case you will have to meet
the :ref:`build prerequisites <build-prerequisites>`.


.. index::
    single: Prerequisites

Prerequisites
-------------

The current `!psycopg2` implementation supports:

..
    NOTE: keep consistent with setup.py and the /features/ page.

- Python version 2.7
- Python 3 versions from 3.4 to 3.8
- PostgreSQL server versions from 7.4 to 12
- PostgreSQL client library version from 9.1



.. _build-prerequisites:

Build prerequisites
^^^^^^^^^^^^^^^^^^^

The build prerequisites are to be met in order to install Psycopg from source
code, from a source distribution package, GitHub_ or from PyPI.

.. _GitHub: https://github.com/psycopg/psycopg2

Psycopg is a C wrapper around the libpq_ PostgreSQL client library. To install
it from sources you will need:

- A C compiler.

- The Python header files. They are usually installed in a package such as
  **python-dev** or **python3-dev**. A message such as *error: Python.h: No
  such file or directory* is an indication that the Python headers are
  missing.

- The libpq header files. They are usually installed in a package such as
  **libpq-dev**. If you get an *error: libpq-fe.h: No such file or directory*
  you are missing them.

- The :program:`pg_config` program: it is usually installed by the
  **libpq-dev** package but sometimes it is not in a :envvar:`PATH` directory.
  Having it in the :envvar:`PATH` greatly streamlines the installation, so try
  running ``pg_config --version``: if it returns an error or an unexpected
  version number then locate the directory containing the :program:`pg_config`
  shipped with the right libpq version (usually
  ``/usr/lib/postgresql/X.Y/bin/``) and add it to the :envvar:`PATH`:

  .. code-block:: console

    $ export PATH=/usr/lib/postgresql/X.Y/bin/:$PATH

  You only need :program:`pg_config` to compile `!psycopg2`, not for its
  regular usage.

Once everything is in place it's just a matter of running the standard:

.. code-block:: console

    $ pip install psycopg2

or, from the directory containing the source code:

.. code-block:: console

    $ python setup.py build
    $ python setup.py install


Runtime requirements
^^^^^^^^^^^^^^^^^^^^

Unless you compile `!psycopg2` as a static library, or you install it from a
self-contained wheel package, it will need the libpq_ library at runtime
(usually distributed in a ``libpq.so`` or ``libpq.dll`` file).  `!psycopg2`
relies on the host OS to find the library if the library is installed in a
standard location there is usually no problem; if the library is in a
non-standard location you will have to tell somehow Psycopg how to find it,
which is OS-dependent (for instance setting a suitable
:envvar:`LD_LIBRARY_PATH` on Linux).

.. note::

    The libpq header files used to compile `!psycopg2` should match the
    version of the library linked at runtime. If you get errors about missing
    or mismatching libraries when importing `!psycopg2` check (e.g. using
    :program:`ldd`) if the module ``psycopg2/_psycopg.so`` is linked to the
    right ``libpq.so``.

.. note::

    Whatever version of libpq `!psycopg2` is compiled with, it will be
    possible to connect to PostgreSQL servers of any supported version: just
    install the most recent libpq version or the most practical, without
    trying to match it to the version of the PostgreSQL server you will have
    to connect to.


.. index::
    single: setup.py
    single: setup.cfg

Non-standard builds
-------------------

If you have less standard requirements such as:

- creating a :ref:`debug build <debug-build>`,
- using :program:`pg_config` not in the :envvar:`PATH`,
- supporting ``mx.DateTime``,

then take a look at the ``setup.cfg`` file.

Some of the options available in ``setup.cfg`` are also available as command
line arguments of the ``build_ext`` sub-command. For instance you can specify
an alternate :program:`pg_config` location using:

.. code-block:: console

    $ python setup.py build_ext --pg-config /path/to/pg_config build

Use ``python setup.py build_ext --help`` to get a list of the options
supported.


.. index::
    single: debug
    single: PSYCOPG_DEBUG

.. _debug-build:

Creating a debug build
^^^^^^^^^^^^^^^^^^^^^^

In case of problems, Psycopg can be configured to emit detailed debug
messages, which can be very useful for diagnostics and to report a bug. In
order to create a debug package:

- `Download`__ and unpack the Psycopg *source package* (the ``.tar.gz``
  package).

- Edit the ``setup.cfg`` file adding the ``PSYCOPG_DEBUG`` flag to the
  ``define`` option.

- :ref:`Compile and install <build-prerequisites>` the package.

- Set the :envvar:`PSYCOPG_DEBUG` environment variable:

.. code-block:: console

    $ export PSYCOPG_DEBUG=1

- Run your program (making sure that the `!psycopg2` package imported is the
  one you just compiled and not e.g. the system one): you will have a copious
  stream of informations printed on stderr.

.. __: https://pypi.org/project/psycopg2/#files


Non-standard Python Implementation
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The `psycopg2` package is the current mature implementation of the adapter: it
is a C extension and as such it is only compatible with CPython_. If you want
to use Psycopg on a different Python implementation (PyPy, Jython, IronPython)
there is a couple of alternative:

- a `Ctypes port`__, but it is not as mature as the C implementation yet
  and it is not as feature-complete;

- a `CFFI port`__ which is currently more used and reported more efficient on
  PyPy, but please be careful of its version numbers because they are not
  aligned to the official psycopg2 ones and some features may differ.

.. _PostgreSQL: https://www.postgresql.org/
.. _Python: https://www.python.org/
.. _libpq: https://www.postgresql.org/docs/current/static/libpq.html
.. _CPython: https://en.wikipedia.org/wiki/CPython
.. _Ctypes: https://docs.python.org/library/ctypes.html
.. __: https://github.com/mvantellingen/psycopg2-ctypes
.. __: https://github.com/chtd/psycopg2cffi


.. index::
    single: tests

.. _test-suite:

Running the test suite
----------------------

Once `!psycopg2` is installed you can run the test suite to verify it is
working correctly. From the source directory, you can run:

.. code-block:: console

    $ python -c "import tests; tests.unittest.main(defaultTest='tests.test_suite')" --verbose

The tests run against a database called ``psycopg2_test`` on UNIX socket and
the standard port. You can configure a different database to run the test by
setting the environment variables:

- :envvar:`PSYCOPG2_TESTDB`
- :envvar:`PSYCOPG2_TESTDB_HOST`
- :envvar:`PSYCOPG2_TESTDB_PORT`
- :envvar:`PSYCOPG2_TESTDB_USER`

The database should already exist before running the tests.


.. _other-problems:

If you still have problems
--------------------------

Try the following. *In order:*

- Read again the :ref:`build-prerequisites`.

- Read the :ref:`FAQ <faq-compile>`.

- Google for `!psycopg2` *your error message*. Especially useful the week
  after the release of a new OS X version.

- Write to the `Mailing List`_.

- If you think that you have discovered a bug, test failure or missing feature
  please raise a ticket in the `bug tracker`_.

- Complain on your blog or on Twitter that `!psycopg2` is the worst package
  ever and about the quality time you have wasted figuring out the correct
  :envvar:`ARCHFLAGS`. Especially useful from the Starbucks near you.

.. _mailing list: https://www.postgresql.org/list/psycopg/
.. _bug tracker: https://github.com/psycopg/psycopg2/issues