なろう分析記録

『小説家になろう』をふくめ『ネット小説投稿サイト』を分析する。コード置き場,主にPython,javascript,たまに創作。

【Pythonサンプルコード】PyMySQLを使ってMySQLテーブルの重複行を削除する方法

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

f:id:karupoimou:20200123045207p:plain:w400
PyMySQL

準備

pip

pip install PyMySQL

PythonからMySQLを操作するパッケージは様々ありますが今回はPyMySQLを使います。

Python3からMySQL繋ぐ時は、いろいろあるけどとりあえずPyMySQLにしとこうや - Qiita

データベース

今回はあらかじめ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)

参考にしたページ

qiita.com
www.dbonline.jp