Skip to content

docker-composeでPythonとPostgreSQLを同時起動します.

dockerの設定

ファイル構成

project_dir
├── /db
│   ├── /psgl
│   └── Dockerfile
└── docker-compose.yml

/db/DockerFile

js
FROM postgres:14
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.UTF-8

./docker-compose.yml

js
version: "3"
services:
  # postgres
  postgres:
      build: ./db
      ports:
        - "5432:5432"
      environment:
        POSTGRES_USER: postgre
        POSTGRES_PASSWORD: postgre
        LANG: ja_JP.UTF-8
      volumes:
        - ./db/psgl:/var/lib/postgresql/data

  notebook:
    # https://hub.docker.com/r/jupyter/datascience-notebookからimageをpullする
    image: jupyter/datascience-notebook
    # ポートの設定("ホスト:コンテナ")
    user: root
    ports:
      - "8888:8888"
    # 環境変数の設定
    environment:
      - JUPYTER_ENABLE_LAB=yes
      - "GRANT_SUDO=yes"
    # ボリューム(データの永続化の場所)の設定(ホスト:コンテナ)
    # ホスト内のworkディレクトリとコンテナ内の/home/jovyan/workディレクトリが紐づいているイメージ
    volumes:
      - ./:/home/jovyan/work
    # postgres -> notebook
    depends_on:
      - postgres
    # 最後にjupyterLabに接続するためのコマンドを実行する。
    command: start-notebook.sh --NotebookApp.token=''

ライブラリのインストール

下記のコードでライブラリをインストールします.

python
!sudo apt-get update
!sudo apt-get -y install libpq-dev gcc
!pip install psycopg2

postgreSQLの操作

postgreSQLの接続確認

python
import os
import psycopg2

# DATABASE_URL='postgresql://postgre:postgre@localhost:5432/postgres'
DATABASE_URL='postgresql://postgre:postgre@workspace-postgres-1:5432/postgres'

def main():
    cursor = psycopg2.connect(DATABASE_URL)
    print(cursor)

if __name__ == '__main__':
    main()

データベース一覧の確認

python
import os
import psycopg2

# DATABASE_URL='postgresql://postgre:postgre@localhost:5432/postgres'
DATABASE_URL='postgresql://postgre:postgre@workspace-postgres-1:5432/postgres'

def main():
    # postgresの接続
    conn = psycopg2.connect(DATABASE_URL)
    print(conn.autocommit)
    cur = conn.cursor()
    
    # データベース一覧の確認
    cur.execute('SELECT datname FROM pg_database;')
    data = cur.fetchall() # 出力結果
    print(data)
    
    # dbとカーソルを閉じる
    cur.close()
    conn.close()

if __name__ == '__main__':
    main()

データベースの作成

python
import os
import psycopg2

# DATABASE_URL='postgresql://postgre:postgre@localhost:5432/postgres'
DATABASE_URL='postgresql://postgre:postgre@workspace-postgres-1:5432/postgres'

def main():
    # postgresの接続
    conn = psycopg2.connect(DATABASE_URL)
    conn.autocommit = True # 操作の重複を防ぐ(databaseの操作)呪文
    cur = conn.cursor()
    
    # データベースの削除
    cur.execute('CREATE database db_test1')
    
    # データベース一覧の確認
    cur.execute('SELECT datname FROM pg_database;')
    data = cur.fetchall() # 出力結果
    print(data)
    
    # dbとカーソルを閉じる
    cur.close()
    conn.close()
    
if __name__ == '__main__':
    main()

データベースの削除

python
import os
import psycopg2

# DATABASE_URL='postgresql://postgre:postgre@localhost:5432/postgres'
DATABASE_URL='postgresql://postgre:postgre@workspace-postgres-1:5432/postgres'

def main():
    # postgresの接続
    conn = psycopg2.connect(DATABASE_URL)
    conn.autocommit = True # 操作の重複を防ぐ(databaseの操作)呪文
    cur = conn.cursor()
    
    # データベースの作成
    cur.execute('DROP database db_test')
    
    # データベース一覧の確認
    cur.execute('SELECT datname FROM pg_database;')
    data = cur.fetchall() # 出力結果
    print(data)
    
    # dbとカーソルを閉じる
    cur.close()
    conn.close()
    
if __name__ == '__main__':
    main()

テーブル一覧の表示

python
import os
import psycopg2

# DATABASE_URL='postgresql://postgre:postgre@localhost:5432/postgres'
DATABASE_URL='postgresql://postgre:postgre@workspace-postgres-1:5432/postgres'

def main():
    # postgresの接続
    conn = psycopg2.connect(DATABASE_URL)
    print(conn.autocommit)
    cur = conn.cursor()
    
    # データベース一覧の確認
    query = '''
            SELECT t.* 
            FROM (
                SELECT TABLENAME,SCHEMANAME,'table' as TYPE from PG_TABLES
                UNION SELECT VIEWNAME,SCHEMANAME,'view' as TYPE from PG_VIEWS
            ) t
            WHERE TABLENAME LIKE LOWER('{0}') 
            and SCHEMANAME like LOWER('{1}') 
            and TYPE like LOWER('{2}')'''
    cur.execute(query)
    data = cur.fetchall() # 出力結果
    print(data)
    
    # dbとカーソルを閉じる
    cur.close()
    conn.close()

if __name__ == '__main__':
    main()

まとめ

docker-composeでPythonとpostgreSQLを同時起動しました.

参考サイト

docker compose

Dockerコンテナ上のPythonプログラムからPostgreSQLに接続する

日本語モードのPostgreSQL, pgAdmin4同時起動docker-compose.yaml

docker-composeでDjangoとPostgreSQLを連携した構築手順(VPS環境)

Docker Compose の depends_on の使い方まとめ

Python + PostgreSQL

Pythonでpsycopg2を使用しPostgreSQLデータベースを作成する

CREATE DATABASE

[DROP DATABASE]((https://www.postgresql.jp/document/9.4/html/sql-dropdatabase.html)

PythonでPostgreSQL(テーブル作成〜)

Python で PostgreSQL を操作してみよう!

PostgreSQLでオートコミットをオフにする方法 †

【 コピペでOK】9割の機能を網羅!PytonからPostgreSQLを扱うクラスを作ってみました。

PostgreSQLでデータベースの一覧を取得する方法