栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python操作Mysql之追加写入Dataframe到数据库(Python/Mysql/去重更新)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python操作Mysql之追加写入Dataframe到数据库(Python/Mysql/去重更新)

本文主要实现利用Python向Mysql数据按主键去重追加写入更新数据,写入数据源为Dataframe类型,可用于爬虫等需要去重追加更新数据的场景。

本文参考网络上相关写入Mysql的代码并作出以下几点优化:

  1. 无需指定需要写入的列名称
  2. 变量名称均用``括起,解决部分特殊变量名引起的报错
  3. 将整个追加写入过程包装成了外部工具类,仅需简单引用即可解决数据追加写入的问题
#!/usr/bin/env python
# -*- coding:utf-8 -*-

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('数据已全部写入完成!')

注意:用此种写入方式写入速度较慢,不建议用于数据量较大的场景。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/529221.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号