この記事には広告を含む場合があります。
記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
こんにちは!たぬきうどんです!
私は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
)
今回使用するDockerfile
とdocker-compose.yaml
は以下です。
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
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ファイルを作成します。
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へ接続する設定は以下になります。
import MySQLdb
db = MySQLdb.connect(
host="python-with-mysql-db",
user="testuser",
password="testpass",
db="test-database"
)
レコード登録例
以下がレコード登録例です。
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()
でトランザクションをコミットという流れです。
レコード取得例
以下がレコード登録例です。
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操作方法でした。
さらに詳しく知りたい!と公式のドキュメントを見てみてください。
この記事が皆さんの助けになれば幸いです!
最後まで読んでいただき、ありがとうございました!