【id列追加】PythonでMySQLテーブルにid列を追加する方法【Docker & Jupyterlab環境】

はじめに

PythonでMySQLにCSVファイルをインポートする【Docker & Jupyterlab環境】

郵便番号データをMySQLに追加する操作をPythonでしてみようと思い立ち実践するも様々なエラーに出くわしつつも無事インポートできるまでを報告。これをDocker & Jupyterlab環境で行った。

上記エントリにてPythonでMySQLにCSVファイルをインポートする方法を書いたが、ここでは、データベースにデータをインポートした後に新規列を追加する方法を模索した結果を詳述する。

上記エントリでMySQLにインポートした日本郵政の郵便番号データ(CSV形式)には、そもそもid列が無い
つまりは、主キー制約のないデータなのである。
将来的にはこのデータをリレーショナルデータベースの一部に使えたらと考えているので、その際主キー制約の列が必要になる。

郵便番号データインポート時、「ユニークなカラムが含まれていません」の注意書きが

ならば、MySQLにインポートする前に、Excelでデータを開いてid列を追加したら、と思われるかもしれない。
しかし、元データをいじる、ということは、思わぬデータの改変やエラー発生の可能性があるので避けたい。

また、郵便番号データのインポート後にphpMyAdminでid列を追加できるが、id番号がランダムに付与されて気持ち悪い状態になる。

そして、新規テーブル作成時に先にid列も作成するコードにすると、作成される列数と郵便番号データの列数が合わずインポート時に正しくない列にインポートされてしまう。

ということで、Python(のモジュール・ライブラリ)やphpでのid列の追加方法を模索した結果、MySQLの構文であっさり解決した。

餅屋は餅屋、だった。

コードの解説

import mysql.connector

db=mysql.connector.connect(host="host.docker.internal", user="root", password="root")
cursor = db.cursor()

# データベースを選択
cursor.execute("USE default_db")
db.commit()

cursor.execute("ALTER TABLE postal_table ADD id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL FIRST;")
db.commit()

1行目:PythonからMySQLにアクセスするためのライブラリ「MySQL Connector/Python」(MySQLの開発元Oracle社提供で随時更新されていてオススメ)の、import時の指定名

3行目mysql.connector.connect()は、MySQL serverへの接続を確立させるメソッド。任意の引数を指定することで、接続を開始させる。
hostの値host.docker.internalは、Dockerコンテナからホストのネットワークにアクセスするための特殊なドメイン、userpasswordの値は、【完成版】DockerにPHP+Apache+MySQL開発環境を設定してみたdocker-composeで設定したMYSQL_ROOT_USERMYSQL_ROOT_PASSWORDの値であるrootを指定。

4行目:cursorの概念をよく理解できていないので、現状は、とりあえず必須コードであるとしておく。

7行目execute()は「Cursorオブジェクトのメソッドで、データベースへの指令(SQL文やコマンド)を実行する」。
USE default_db」はSQL文で、「default_dbという(任意)名のデータベースを使用する」ということ。

8行目commit()「トランザクションをコミットして、その変更を永続的なものに」する処理を行う。大抵はexecute()の直後に置いてexecute()で実行した司令を完了させる。詳細は参考サイトへ。→【2022.2.17追記】commit()の必要な時、不要な時も見よ。も見よ。

10行目

  • execute()内のSQL文「ALTER TABLE」はpostal_tableという名のテーブルに変更を行うという意味
  • 「ALTER TABLE」に付随した「ADD」はpostal_tableに新しいカラムを追加するという意味
  • id追加するカラム名(任意名)
  • INTはカラムのデータ型を整数型と指定
  • UNSIGNEDはINTが負数を使用せず正数のみ使用することを指定
  • AUTO_INCREMENT自動的に一意の識別子を生成
  • PRIMARY KEY主キー制約を指定
  • NOT NULLはNULL値を拒否
  • FIRST一番最初のカラムに新規カラムを追加することを指定。

11行目:commit()で実行した指令を完了。→【2022.2.17追記】commit()の必要な時、不要な時も見よ。

上記10行目のSQL文のAUTO_INCREMENTが肝で、これを指定することでid列追加と同時にid番号が自動で振られる仕組みなのである。

docker-composeの作成|【完成版】DockerにPHP+Apache+MySQL開発環境を設定してみた

【2022.2.17追記】commit()の必要な時、不要な時|【まとめ】PythonでMySQLにCSVファイルをインポートする【Docker & Jupyterlab環境】



こうしてid列が追加され、id番号も自動付加された


参照元

execute()についての解説がわかりやすい。

mysql-connector-pythonのexecuteとexecutemany

PythonのMySQLドライバ、mysql-connector-pythonのexecuteとexecutemanyメソッドの機能や使い方について説明しています。


データベースにおけるコミットとトランザクションとロールバックの意味について。

Python データベース commit()は何をしているのでしょうか?













コメント

よく読まれている記事

CSSボタンでテキストを天地中央に揃えるとき、なぜボタン高と行高を一緒にするのか

FullCalendarの導入からカレンダー毎の色指定まで

FacebookページのフィードURLを取得しウォールを自サイトに表示