【mysqlclient】PythonでMySQLを操作する

こんにちは!たぬきうどんです!

私は2018年に非IT業界から未経験でエンジニアに転職し、現在までエンジニアとして働いています。

この記事ではPythonとmysqlclientモジュールを使ったMySQL操作方法を説明します。

PythonでMySQLを操作したいと思っている方はぜひご覧ください!

環境構築方法

環境

今回の実行環境&エディタは下記です。

  • Windows OS
  • Docker
  • Visual Studio Code

また、下記のVisual Studio Codeの拡張を使用します。

  • Remote-Containers(ms-vscode-remote.remote-containers
  • Python(ms-python.python
  • Pylance(ms-python.vscode-pylance

今回使用するDockerfiledocker-compose.yamlは以下です。

Dockerfile
FROM ubuntu:20.04

ARG DLPATH=/dl-python
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm
ENV PATH /root/.local/bin:/workspace/app:$PATH

RUN apt update &&\
    apt install -y build-essential libbz2-dev libdb-dev \
        libreadline-dev libffi-dev libgdbm-dev liblzma-dev \
        libncursesw5-dev libsqlite3-dev libssl-dev \
        zlib1g-dev uuid-dev curl gcc libmariadb-dev

WORKDIR $DLPATH

RUN curl -OL https://www.python.org/ftp/python/3.9.10/Python-3.9.10.tar.xz &&\
    tar xJf Python-3.9.10.tar.xz &&\
    cd ./Python-3.9.10 &&\
    ./configure &&\
    make &&\
    make install

RUN pip3 install --upgrade pip

RUN curl -sSL https://install.python-poetry.org | python3 - &&\
    poetry config virtualenvs.create false
docker-compose.yaml
version: "3"

services:
  python-with-mysql:
    build:
      context: .
      dockerfile: Dockerfile
    depends_on:
      - python-with-mysql-db

  python-with-mysql-db:
    image: mysql:8.0.29
    container_name: test-python-with-mysql-db
    volumes:
      - ./db-data:/var/lib/mysql
      - ./initdb:/docker-entrypoint-initdb.d
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test-database
      MYSQL_USER: testuser
      MYSQL_PASSWORD: testpass
      TZ: "Asia/Tokyo"
    ports:
      - "3306:3306"
    command: --default-authentication-plugin=mysql_native_password

今回の実行環境については

Python + Docker + Poetry開発環境を構築してみる

を読むと更に理解が深まります。

DB初期化

MySQLコンテナ作成時に今回使用するテーブルを作成しておきます。

作業ディレクトリ下にinitdbディレクトリを作成し、その下に以下のSQLファイルを作成します。

init.sql
CREATE TABLE user
(
  id INT AUTO_INCREMENT,
  name VARCHAR(40),
  description VARCHAR(40),
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  index(id)
);

initdbディレクトリはMySQLコンテナ内のdocker-entrypoint-initdb.dディレクトリにマウントされ、コンテナ作成時にinit.sqlが実行され、テーブルが作成されます。

操作してみる

それでは操作していきましょう。

以下は python-with-mysqlコンテナ内で実行していきます。

mysqlclientモジュールのインストール

mysqlclientモジュールをインストールします。

poetry add mysqlclient

MySQLに接続する

MySQLへ接続する設定は以下になります。

Python
import MySQLdb

db = MySQLdb.connect(
    host="python-with-mysql-db",
    user="testuser",
    password="testpass",
    db="test-database"
)

レコード登録例

以下がレコード登録例です。

Python
import MySQLdb

db = MySQLdb.connect(
    host="python-with-mysql-db",
    user="testuser",
    password="testpass",
    db="test-database"
)

# カーソルを取得
cur = db.cursor()

# INSERTクエリ
sql = """
INSERT INTO user (name, description) VALUES ('iiyama kazuo', 'owner')
"""
# クエリを実行
cur.execute(sql)

# トランザクションをコミット
db.commit()

# 接続を閉じる
db.close()

db.cursor()でカーソルを取得し、実行するクエリを定義し、cur.execute(クエリ)でクエリを実行。

その後にdb.commit()でトランザクションをコミットという流れです。

レコード取得例

以下がレコード登録例です。

Python
import MySQLdb

db = MySQLdb.connect(
    host="python-with-mysql-db",
    user="testuser",
    password="testpass",
    db="test-database"
)

# カーソルを取得
cur = db.cursor()

# SELECTクエリ
sql = """
SELECT * from user
"""

# クエリを実行
cur.execute(sql)

# 全件取得
rows = cur.fetchall()

# 接続を閉じる
db.close()

レコードを取得する場合はクエリを実行した後、cur.fetchall()(全件取得)やcur.fetchone()(1件のみ取得)といった処理が必要になります。

さいごに

以上が簡単ですが、Pythonとmysqlclientモジュールを使ったMySQL操作方法でした。

さらに詳しく知りたい!と公式のドキュメントを見てみてください。

この記事が皆さんの助けになれば幸いです!

最後まで読んでいただき、ありがとうございました!

コメントを残す

メールアドレスが公開されることはありません。