【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コンテナからホストのネットワークにアクセスするための特殊なドメイン、user、passwordの値は、【完成版】DockerにPHP+Apache+MySQL開発環境を設定してみたのdocker-composeで設定したMYSQL_ROOT_USER、MYSQL_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環境】
参照元
execute()についての解説がわかりやすい。
mysql-connector-pythonのexecuteとexecutemany
PythonのMySQLドライバ、mysql-connector-pythonのexecuteとexecutemanyメソッドの機能や使い方について説明しています。
データベースにおけるコミットとトランザクションとロールバックの意味について。
Python データベース commit()は何をしているのでしょうか?
コメント
コメントを投稿