今回はPyMySQLを使って、PythonからMySQLを操作しDBテーブル内の重複レコードを削除する方法をご紹介したいと思います。

準備
データベース
今回はあらかじめDBの中にテーブルを用意しておき、その既存のテーブルに対して重複レコードの消す操作を行いたいと思います。
サンプルコード
import pymysql.cursors # MySQLに接続する connection = pymysql.connect(host='localhost', user='ユーザー名', password='パスワード', db='データベース名', charset='utf8', cursorclass=pymysql.cursors.DictCursor) # SQLを操作する with connection.cursor() as cursor: #「my_table」から「tw_id」が重複を省いた仮テーブル「my_table_temp」を作成する sql = "CREATE TEMPORARY TABLE my_table_temp AS SELECT MIN(tw_id), tw_text, tw_date FROM my_table GROUP BY tw_id;" cursor.execute(sql) #「my_table」を一旦空にする sql = "TRUNCATE table my_table;" cursor.execute(sql) #「my_table」に「my_table_temp」を代入する sql = "INSERT INTO my_table SELECT * FROM my_table_temp;" cursor.execute(sql) #「my_table_temp」を消す sql = "DROP TABLE pixiv_tw_temp;" cursor.execute(sql) # 変更をコミットする connection.commit() # MySQLから切断する connection.close()
コードの説明
① まず元テーブルから重複レコードを省いた仮テーブルを作成
sql = "CREATE TEMPORARY TABLE my_table_temp AS SELECT MIN(tw_date), tw_text, tw_id FROM my_table GROUP BY tw_id;"
AS SELECT MIN(tw_id), tw_text, tw_date
の部分は取ってくる列名を指定してます。
GROUP BY tw_id;
ここでグループ化することにより、tw_idが重複する場合一つだけ残しあとは選択しない様にしています。
なお、tw_idが重複するレコードの中でどのレコードを残すのかについては
MIN(tw_id),
の部分で設定しています。
【MySQL】最小値を取得する(min の使い方) | 初心者向け完全無料プログラミング入門
② 次に元テーブルの内容を一旦クリアし、
#「my_table」を一旦空にする
sql = "TRUNCATE table my_table;"
③ 最後に
#「my_table」に「my_table_temp」を代入する
sql = "INSERT INTO my_table SELECT * FROM my_table_temp;"
cursor.execute(sql)#「my_table_temp」を消す
sql = "DROP TABLE pixiv_tw_temp;"
cursor.execute(sql)