MacのDockerにインストールしたPostgreSQLを、psycopg2とPythonから操作

最終更新日

PostgreSqlをMacOSのDockerにインストールして競馬用のデータベースを作ろうと思い、UbuntuのJupyter LabからそのPostgreSQLにアクセスるまでの記録です。
下記環境でやってます。

  • Ubuntu18
  • pyenv
  • Python 3.7.7

pipenv install psycopg2 でのエラー

PythonからPostgreSQLにアクセスするためにはpsycopg2をインストールすればいいらしく、まず単純にpipenv installしてみます。
エラーが出ました。

$ pipenv install psycopg2
Installing psycopg2…
Adding psycopg2 to Pipfile's [packages]…
✔ Installation Succeeded 
Pipfile.lock (1af615) out of date, updating to (a78e0d)…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
✔ Success! 
Updated Pipfile.lock (1af615)!
Installing dependencies from Pipfile.lock (1af615)…
An error occurred while installing psycopg2==2.9.1 --hash=sha256:079d97fc22de90da1d370c90583659a9f9a6ee4007355f5825e5f1c70dffc1fa --hash=sha256:2087013c159a73e09713294a44d0c8008204d06326006b7f652bef5ace66eebb --hash=sha256:2c992196719fadda59f72d44603ee1a2fdcc67de097eea38d41c7ad9ad246e62 --hash=sha256:7640e1e4d72444ef012e275e7b53204d7fab341fb22bc76057ede22fe6860b25 --hash=sha256:7f91312f065df517187134cce8e395ab37f5b601a42446bdc0f0d51773621854 --hash=sha256:830c8e8dddab6b6716a4bf73a09910c7954a92f40cf1d1e702fb93c8a919cc56 --hash=sha256:89409d369f4882c47f7ea20c42c5046879ce22c1e4ea20ef3b00a4dfc0a7f188 --hash=sha256:bf35a25f1aaa8a3781195595577fcbb59934856ee46b4f252f56ad12b8043bcf --hash=sha256:de5303a6f1d0a7a34b9d40e4d3bef684ccc44a49bbe3eb85e3c0bffb4a131b7c! Will try again.
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 114/114 — 00:00:26
Installing initially failed dependencies…
[pipenv.exceptions.InstallError]:   File "/home/toshiya/.pyenv/versions/3.7.7/lib/python3.7/site-packages/pipenv/core.py", line 1992, in do_install
[pipenv.exceptions.InstallError]:       skip_lock=skip_lock,
[pipenv.exceptions.InstallError]:   File "/home/toshiya/.pyenv/versions/3.7.7/lib/python3.7/site-packages/pipenv/core.py", line 1253, in do_init
[pipenv.exceptions.InstallError]:       pypi_mirror=pypi_mirror,
[pipenv.exceptions.InstallError]:   File "/home/toshiya/.pyenv/versions/3.7.7/lib/python3.7/site-packages/pipenv/core.py", line 859, in do_install_dependencies
[pipenv.exceptions.InstallError]:       retry_list, procs, failed_deps_queue, requirements_dir, **install_kwargs
[pipenv.exceptions.InstallError]:   File "/home/toshiya/.pyenv/versions/3.7.7/lib/python3.7/site-packages/pipenv/core.py", line 763, in batch_install
[pipenv.exceptions.InstallError]:       _cleanup_procs(procs, not blocking, failed_deps_queue, retry=retry)
[pipenv.exceptions.InstallError]:   File "/home/toshiya/.pyenv/versions/3.7.7/lib/python3.7/site-packages/pipenv/core.py", line 681, in _cleanup_procs
[pipenv.exceptions.InstallError]:       raise exceptions.InstallError(c.dep.name, extra=err_lines)
[pipenv.exceptions.InstallError]: ['Collecting psycopg2==2.9.1', '  Using cached psycopg2-2.9.1.tar.gz (379 kB)']
[pipenv.exceptions.InstallError]: ['ERROR: Command errored out with exit status 1:', '     command: /home/toshiya/.local/share/virtualenvs/keiba-fIgOWeR2/bin/python -c \'import sys, setuptools, tokenize; sys.argv[0] = \'"\'"\'/tmp/pip-install-9e2lkyx2/psycopg2/setup.py\'"\'"\'; __file__=\'"\'"\'/tmp/pip-install-9e2lkyx2/psycopg2/setup.py\'"\'"\';f=getattr(tokenize, \'"\'"\'open\'"\'"\', open)(__file__);code=f.read().replace(\'"\'"\'\\r\\n\'"\'"\', \'"\'"\'\\n\'"\'"\');f.close();exec(compile(code, __file__, \'"\'"\'exec\'"\'"\'))\' egg_info --egg-base /tmp/pip-install-9e2lkyx2/psycopg2/pip-egg-info', '         cwd: /tmp/pip-install-9e2lkyx2/psycopg2/', '    Complete output (23 lines):', '    running egg_info', '    creating /tmp/pip-install-9e2lkyx2/psycopg2/pip-egg-info/psycopg2.egg-info', '    writing /tmp/pip-install-9e2lkyx2/psycopg2/pip-egg-info/psycopg2.egg-info/PKG-INFO', '    writing dependency_links to /tmp/pip-install-9e2lkyx2/psycopg2/pip-egg-info/psycopg2.egg-info/dependency_links.txt', '    writing top-level names to /tmp/pip-install-9e2lkyx2/psycopg2/pip-egg-info/psycopg2.egg-info/top_level.txt', "    writing manifest file '/tmp/pip-install-9e2lkyx2/psycopg2/pip-egg-info/psycopg2.egg-info/SOURCES.txt'", '    ', '    Error: pg_config executable not found.', '    ', '    pg_config is required to build psycopg2 from source.  Please add the directory', '    containing pg_config to the $PATH or specify the full executable path with the', '    option:', '    ', '        python setup.py build_ext --pg-config /path/to/pg_config build ...', '    ', "    or with the pg_config option in 'setup.cfg'.", '    ', '    If you prefer to avoid building psycopg2 from source, please install the PyPI', "    'psycopg2-binary' package instead.", '    ', "    For further information please check the 'doc/src/install.rst' file (also at", '    ).', '    ', '    ----------------------------------------', 'ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.']
ERROR: ERROR: Package installation failed...

解決方法

pipのpsycopg2のインストールでError: pg_config executable not found
こちらを参考に解決できました。ただCentOS系だったため、下記を実行すれば良いみたいですが、

$ yum install -y postgresql-devel

自分はUbuntuだったため、さらに以下を参考にして、
ubuntu 20.04 に postgres postgresql を install する

$ sudo apt install libpq-dev
$ sudo apt list | grep postgresql-server-dev*
$ sudo apt install postgresql-server-dev-10

再度、psycopg2のインストールです。

$ pipenv install psycopg2

今度は成功しました。

PostgreSQLへアクセスする

ここからJupyter Labでの作業です。以下を参考にしました。
PYTHONでPOSTGRESQLのデータを呼び出す–PSYCOPG2

PostgreSQLへアクセスする

確認ですがMacのDocker内PostgreSQLはこんな感じで起動しています。

postgres   docker-entrypoint.sh postgres   Up      0.0.0.0:15432->5432/tcp
import pandas as pd
import psycopg2 as pg
conn = pg.connect("host='192.168.1.10' port=15432 dbname=XXXXX user=XXXXX password='XXXXXXXXXXX'")
sql = 'select * from テーブル名'
df = pd.read_sql_query(sql, conn)
conn = None

これでdfにDataFrame型で、データベースからデータが取得できました。
多少、エラーで躓くところなどありましたが、参考にさせていただいたサイトのおかげで、意外とすんなり行った気がします。感謝です。

鹿児島県の出水市という所に住んでいまして、インターネット周辺で色々活動して行きたいと思ってるところです。 Webサイト作ったり、サーバ設定したり、プログラムしたりしている、釣りと木工好きなMacユーザです。 今はデータサイエンスに興味を持って競馬AI予想を頑張ってます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください