calendarcodediamondfacebookfingerglobalgoogleplushatenahomepagetopplainpocketrssservicetwitterwordpresshome2searchfoldernext-arrowback-arrowfirst-arrowlast-arrow

Python: MySQL へ接続するモジュール mysqlclient(MySQLdb)の使い方

MySQL へ接続するモジュール mysqlclient を使うには、インポートの際に MySQLdb と記述する必要がある。

エンジニア速報は Twitter の@commteで配信しています。

Sponsored Link

mysqlclient のインストール

MySQL と mysqlclient をインストールする。

brew install mysql
pip install mysqlclient

mysqlclient · PyPI

mysqlclient のインポート

import MySQLdb

インポートしたときに ModuleNotFoundError エラーが出る場合は、インポートしたときに「ModuleNotFoundError」になる場合の対処法を参考にするとよい。

Python DB API のバージョンを確認する

インポートが正しく動いたら、データベースのモジュールが PEP 249 に準拠しているか調べておこう。

Python の扱うデータベース API は、PEP 249によって、API 仕様の統一がされている。

apilevel

データベースのモジュールが、PEP 249 に準拠しているか調べたい場合、apilevel を使う。apilevel は、サポートされているデータベース API レベルを示す文字列定数である。現在、文字列「1.0」と「2.0」のみが許可されている。

import MySQLdb
print(MySQLdb.apilevel)
# 2.0

2.0 と表示された。DB API 2.0 に準拠している。

データベース作成

次に、データベースを作る。sample というデータベースを作成してみよう。mysql をたたいた後で、create database を入れる。

mysql
create database sample;

データベースに接続しテーブルを作る

基本的なメソッドは次のとおり。データベースを使うには connect 関数で接続する必要がある。

MySQLdb.connect(パラメータ)
connect 関数の引数
引数名 説明 省略可能
user ユーザー名
passwd パスワード
host ホスト名
charset 言語指定
port ポート
db データベース名 不可
代表的なカーソルオブジェクトのメソッド

cursor() はカーソルオブジェクトを返す。カーソルはクエリを実行し、その結果を調べるのに使われる。

カーソルとは

データベースにおけるカーソル(Cursor)は、一連のデータに順にアクセスする際の検索条件および「現在位置」を保持するデータ要素である。 カーソル (データベース) - Wikipedia

execute("SQL 文") で SQL を実行する。

メソッド 処理
cursor() カーソルオブジェクトを返す
execute() テーブル作成、データ作成、情報表示
conn.commit() SQL 命令文を実行後にデータベースへの変更を行う
close() カーソルをクローズする
fetchall() 全ての行をシーケンスとして取り出す

with 文

データベースのモジュールを扱うときは、コンテキストマネージャー(with 文の前後で処理を実行する)の with を合わせて使うのがよい。なぜなら、動作が完了するとファイルが確実に閉じられるからである。

※ 次のコードのconnectの中にある user、passwd、host のリテラルは、あえて空白にしている。ダブルクォーテーションに見えるがシングルクォーテーションである。

"""MySQL モジュール
create database sample;
"""
import MySQLdb
# MySQL実行処理 データベースに接続
with MySQLdb.connect(
    user='',
    passwd='',
    host='',
    db='sample',
    charset='utf8'
    ) as conn:
    # cursor() はカーソルオブジェクトを返す
    # カーソルを取得
    with conn.cursor() as cur:
        # execute("SQL文") は、SQL実行
        # テーブル初期化
        cur.execute("DROP TABLE IF EXISTS person")
        # テーブルを作る
        cur.execute("""CREATE TABLE person
        (id integer,
        name text)
        """)
        # Insert実行
        cur.execute("""INSERT INTO person
        (id, name) VALUES (1, 'user1')
        """)
        # 情報を引き出す
        cur.execute('SELECT * FROM person')
        # print(cur.fetchall())
        # もしくは
        for i in cur:
            print(i)

上述したコードの流れを日本語化するとこのようになる。

1. connect() でデータベース sample に接続
2. cursor() でカーソルを取得する
   1. テーブルを初期化
   2. テーブル作成
   3. Insert 実行
   4. 情報表示

for 文のところは、print(cur.fetchall()) でもよい。次は、複数のデータを挿入したケースである。

"""MySQL モジュール
create database sample;
"""
import MySQLdb
with MySQLdb.connect(
    user='',
    passwd='',
    host='',
    db='sample',
    charset='utf8'
    ) as conn:
    # カーソルを取得
    with conn.cursor() as cur:
        # テーブル初期化
        cur.execute("DROP TABLE IF EXISTS blog")
        # テーブルを作る
        cur.execute("""CREATE TABLE blog(
            id int,
            title varchar(100),
            body text,
            created datetime
            )""")
        # データの追加
        cur.execute("INSERT INTO blog VALUES(1, 'a', 'b', '2021-01-01')")
        cur.execute("INSERT INTO blog VALUES(2, 'c', 'd', '2021-01-01')")
        cur.execute("INSERT INTO blog VALUES(3, 'e', 'f', '2021-01-01')")
        # 一覧表示
        cur.execute("SELECT * FROM blog")
        print(cur.fetchall())

SQL 文の「DROP TABLE IF EXISTS」は、指定した名前のテーブルが存在する場合はテーブルを削除し、存在しない場合はテーブルをスキップするという意味である。

Python おすすめ本

スポンサード リンク

Comments

Leave a Comment

コメントする

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