この記事では、主に Python を使用して主キーに従って Mysql データに更新データを重複排除、追加、書き込みする方法を実装します。データ ソースはデータフレーム タイプであり、データの重複排除、追加、更新が必要なクローラなどのシナリオで使用できます。
この記事では、インターネット上の Mysql で記述されたコードを参照し、次の最適化を行います。
- 書き込む必要がある列名を指定する必要はありません
- 一部の特殊な変数名に起因するエラーを解決するために、変数名を `` で囲みます。
- 追加書き込み処理全体を外部ツールクラスにラップし、簡単な参照のみでデータ追加書き込みの問題を解決
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 读取本地 excel 数据集到 Dataframe 中, 调用数据库工具类 DBUtils 中的insert_data 追加写入数据到数据库中
import os
import pymysql
import pandas as pd
from DBUtils import DBUtils
# 读取数据集
file_path = os.getcwd() + '/'
data = pd.read_excel(file_path + "data.xlsx")
data.fillna("", inplace=True) # 替换NaN,否则数据写入时会报错,也可替换成其他
# 连接数据库,定义变量
db = pymysql.connect(host='192.168.1.1', user='root', password='1234', port=3306, db='database_name')
cursor = db.cursor()
table = "table_name" # 写入表名
# 写入数据
DBUtils.insert_data(DBUtils(db, cursor, data, table))
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class DBUtils:
"""
数据库工具类
"""
""":param
db: 数据库连接: db = pymysql.connect(host='192.168.1.1', user='root', password='1234', port=3306, db='database_name')
cursor: 数据库游标: cursor = db.cursor()
data: 需写入数据: Dataframe
table: 写入表名
"""
def __init__(self, db, cursor, data, table):
self.db = db
self.cursor = cursor
self.data = data
self.table = table
# 按主键去重追加更新
def insert_data(self):
keys = ', '.join('`' + self.data.keys() + '`')
values = ', '.join(['%s'] * len(self.data.columns))
# 根据表的唯一主键去重追加更新
sql = 'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE'.format(table=self.table,
keys=keys,
values=values)
update = ','.join(["`{key}` = %s".format(key=key) for key in self.data])
sql += update
for i in range(len(self.data)):
try:
self.cursor.execute(sql, tuple(self.data.loc[i]) * 2)
print('正在写入第%d条数据' % (i + 1))
self.db.commit()
except Exception as e:
print("数据写入失败,原因为:" + e)
self.db.rollback()
self.cursor.close()
self.db.close()
print('数据已全部写入完成!')
注: この書き込み方法の書き込み速度は遅いため、大量のデータを扱うシナリオには推奨されません。