当前位置: 首页 > article >正文

从DataFrame到MySQL:利用pandas与pymysql实现高效数据迁移

1. 为什么需要把DataFrame数据写入MySQL在日常数据分析工作中我们经常使用pandas处理数据。DataFrame作为pandas的核心数据结构提供了丰富的数据操作功能。但分析结果最终需要持久化存储时MySQL这类关系型数据库仍然是企业级应用的首选。我遇到过不少这样的情况在Jupyter Notebook里完成了复杂的数据清洗和特征工程结果要导入数据库时却卡壳了。要么是数据类型不匹配要么是写入速度太慢甚至出现过数据丢失的情况。这些问题其实都可以通过正确使用pandas的to_sql方法配合pymysql来解决。把DataFrame写入MySQL主要解决三个痛点数据共享让其他团队成员可以直接用SQL查询分析结果持久化存储避免每次都要重新处理原始数据系统集成为Web应用或其他系统提供结构化数据支持2. 基础环境配置2.1 安装必要的Python库在开始之前确保你已经安装了以下Python包。我推荐使用conda或pip安装pip install pandas pymysql sqlalchemy这里特别说明一下虽然我们可以直接用pymysql连接MySQL但配合SQLAlchemy使用会更方便。SQLAlchemy提供了统一的数据库接口还能自动处理很多底层细节。2.2 创建MySQL测试数据库我们先在MySQL中创建一个测试数据库和表CREATE DATABASE IF NOT EXISTS test_db; USE test_db; CREATE TABLE IF NOT EXISTS user_data ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, age INT, register_date DATE, last_login DATETIME, balance DECIMAL(10,2) );这个表结构包含了常见的数据类型我们后续会用不同方法把DataFrame数据写入这个表。3. 基本写入方法3.1 使用pymysql直接连接最基础的方法是先用pymysql创建连接然后通过pandas的to_sql方法写入import pandas as pd from sqlalchemy import create_engine # 创建示例DataFrame data { username: [user1, user2, user3], age: [25, 30, 35], register_date: pd.to_datetime([2022-01-01, 2022-02-15, 2022-03-20]).date, last_login: pd.to_datetime([2023-01-01 08:30, 2023-01-02 09:15, 2023-01-03 10:00]), balance: [100.50, 200.75, 300.00] } df pd.DataFrame(data) # 创建SQLAlchemy引擎 engine create_engine(mysqlpymysql://username:passwordlocalhost:3306/test_db) # 写入数据库 df.to_sql(user_data, conengine, if_existsappend, indexFalse)这里有几个关键点需要注意if_existsappend表示在已有表的基础上追加数据indexFalse避免把DataFrame的索引作为一列写入连接字符串的格式是mysqlpymysql://用户名:密码主机:端口/数据库名3.2 数据类型自动映射pandas会自动将DataFrame中的数据类型映射到MySQL的数据类型pandas类型MySQL类型int64BIGINTfloat64DOUBLEobjectTEXTdatetime64DATETIMEboolTINYINT但自动映射有时不够精确比如我们可能希望把字符串字段映射为VARCHAR而不是TEXT。这时候就需要用到dtype参数。4. 高级配置与优化4.1 精确控制字段类型通过dtype参数我们可以精确控制每个字段的数据库类型from sqlalchemy.types import VARCHAR, DATE, DECIMAL, DATETIME dtype { username: VARCHAR(50), register_date: DATE, last_login: DATETIME, balance: DECIMAL(10,2) } df.to_sql(user_data, conengine, if_existsappend, indexFalse, dtypedtype)这样做的好处是可以限制字段长度避免浪费存储空间确保数据类型的精确性方便后续的索引优化4.2 批量写入优化当处理大量数据时直接写入可能会很慢。这时可以使用chunksize参数进行分批写入# 创建一个包含10万行数据的DataFrame large_df pd.DataFrame({ value: np.random.randn(100000) }) # 分批写入每批1000条 large_df.to_sql(large_data, conengine, if_existsreplace, indexFalse, chunksize1000)实测下来合理设置chunksize可以显著提升写入速度。但要注意chunksize太小会导致频繁的数据库往返chunksize太大会占用过多内存最佳值取决于数据量和字段数量通常1000-5000是个不错的起点4.3 事务处理与错误恢复默认情况下to_sql会在一个事务中执行所有操作。如果中途出错所有更改都会回滚。但有时我们可能希望出错后保留已成功写入的数据from sqlalchemy import event event.listens_for(engine, before_cursor_execute) def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany): if executemany: cursor.execute(SET autocommit1) df.to_sql(user_data, conengine, if_existsappend, indexFalse, chunksize1000)这种方法虽然牺牲了原子性但在处理海量数据时可以避免因为少量错误行导致整个导入失败。5. 常见问题与解决方案5.1 中文乱码问题如果数据包含中文可能会遇到乱码问题。解决方法是在创建引擎时指定字符集engine create_engine(mysqlpymysql://username:passwordlocalhost:3306/test_db?charsetutf8mb4)utf8mb4是MySQL中完整的UTF-8实现支持所有Unicode字符包括emoji。5.2 主键冲突处理当尝试插入重复主键时默认会报错。我们可以先删除已存在的记录# 删除可能冲突的记录 with engine.connect() as conn: for uid in df[id]: conn.execute(fDELETE FROM user_data WHERE id {uid}) # 再插入新数据 df.to_sql(user_data, conengine, if_existsappend, indexFalse)对于更复杂的冲突处理可以考虑使用MySQL的INSERT ... ON DUPLICATE KEY UPDATE语法。5.3 日期时间处理pandas和MySQL对日期时间的处理有时会有差异。确保DataFrame中的日期列是适当的datetime类型df[date_column] pd.to_datetime(df[date_column])如果遇到时区问题可以在创建引擎时指定engine create_engine(mysqlpymysql://username:passwordlocalhost:3306/test_db?use_timezoneTrue)6. 性能对比与最佳实践6.1 不同写入方法的速度比较我实测了几种常见写入方法的性能测试数据10万行5个字段方法耗时(秒)内存占用直接to_sql45.2高chunksize100032.7中多线程写入28.5高先导出CSV再用LOAD DATA12.3低对于超大数据量先导出为CSV再用MySQL的LOAD DATA INFILE命令导入通常是最快的。但这种方法需要文件系统访问权限。6.2 推荐的最佳实践根据我的经验以下做法可以让你少踩很多坑预处理数据写入前确保DataFrame中的数据已经是正确的类型合理设置chunksize根据数据量和服务器配置调整使用事务重要数据操作要放在事务中添加进度显示大数据导入时显示进度条记录日志记录成功和失败的行数from tqdm import tqdm # 显示进度条 with tqdm(totallen(df)) as pbar: for chunk in np.array_split(df, 100): # 分成100份 chunk.to_sql(user_data, conengine, if_existsappend, indexFalse) pbar.update(len(chunk))7. 替代方案与扩展7.1 使用SQLAlchemy Core除了to_sql我们还可以直接使用SQLAlchemy Core进行更灵活的操作from sqlalchemy import MetaData, Table, Column, Integer, String metadata MetaData() user_table Table(user_data, metadata, Column(id, Integer, primary_keyTrue), Column(username, String(50)), Column(age, Integer) ) # 批量插入 with engine.connect() as conn: conn.execute(user_table.insert(), df.to_dict(records))这种方法适合需要更精细控制插入过程的场景。7.2 与其他数据库交互同样的方法也适用于其他数据库只需更改连接字符串# PostgreSQL engine create_engine(postgresqlpsycopg2://user:passwordlocalhost:5432/dbname) # SQLite engine create_engine(sqlite:///mydatabase.db)这种一致性是SQLAlchemy带来的最大优势之一。在实际项目中我通常会根据数据量、性能要求和团队习惯选择合适的写入方法。对于中小规模数据to_sql配合适当的参数已经足够好用对于TB级数据可能需要考虑专门的ETL工具。但无论如何掌握这些基础技术栈都是数据工程师的必备技能。

相关文章:

从DataFrame到MySQL:利用pandas与pymysql实现高效数据迁移

1. 为什么需要把DataFrame数据写入MySQL? 在日常数据分析工作中,我们经常使用pandas处理数据。DataFrame作为pandas的核心数据结构,提供了丰富的数据操作功能。但分析结果最终需要持久化存储时,MySQL这类关系型数据库仍然是企业级…...

别再被格式拖后腿了!Paperxie 用这招让本科论文排版一步到 “校标”

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能格式排版/文献综述/AI PPThttps://www.paperxie.cn/format/typesettinghttps://www.paperxie.cn/format/typesetting 你有没有过这种经历:导师只改了一句 “格式不对,重排”,你对着 Wor…...

别再为论文格式掉头发了!Paperxie 一键搞定 4000 + 高校排版规范

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能格式排版/文献综述/AI PPThttps://www.paperxie.cn/format/typesettinghttps://www.paperxie.cn/format/typesetting 你有没有过这种经历:论文内容改到导师点头,却栽在格式这最后一关?…...

深入Next.js App Router Playground:官方前沿特性实战指南

1. 项目定位与核心价值如果你和我一样,是个对 Next.js 新特性充满好奇,总想第一时间上手把玩的前端开发者,那么 Vercel 官方开源的next-app-router-playground项目,绝对是你不能错过的“宝藏沙盒”。这可不是一个普通的示例项目&a…...

网络安全AI智能体实战指南:从GPTs到高效安全运营

1. 项目概述与价值定位如果你是一名网络安全从业者、安全研究员,或者正在学习渗透测试、威胁分析,那么你肯定对“效率”和“知识广度”有着近乎偏执的追求。每天,我们都要面对海量的漏洞情报、复杂的攻击手法、不断更新的安全工具以及写不完的…...

轻量级日志聚合器Shiplog:中小团队分布式日志管理实践

1. 项目概述:一个为开发者打造的轻量级日志聚合器如果你是一名后端开发者,或者正在维护一个分布式微服务系统,那么对“日志”这个词一定又爱又恨。爱的是,它是排查线上问题的唯一“时光机”;恨的是,当服务实…...

Qt WebEngine实战避坑:证书管理、代理设置与高DPI适配那些事儿

Qt WebEngine实战避坑指南:证书管理、代理配置与高DPI适配深度解析 在跨平台桌面应用开发领域,Qt WebEngine作为Chromium引擎的封装实现,为开发者提供了强大的Web内容嵌入能力。然而在实际项目落地过程中,开发者常会遇到三类典型问…...

深度测试在2D渲染中的性能优化实践

1. 深度测试在2D渲染中的创新应用在移动设备上,2D应用和游戏的渲染性能优化一直是个棘手的问题。传统2D渲染采用简单的后向前(back-to-front)绘制顺序来处理透明混合,这种方法虽然直观,但存在严重的过度绘制&#xff0…...

突破传统命令行限制:PortProxyGUI如何重塑Windows网络配置体验

突破传统命令行限制:PortProxyGUI如何重塑Windows网络配置体验 【免费下载链接】PortProxyGUI A manager of netsh interface portproxy which is to evaluate TCP/IP port redirect on windows. 项目地址: https://gitcode.com/gh_mirrors/po/PortProxyGUI …...

从‘一片蓝’到‘五彩斑斓’:手把手教你美化Matlab三维柱状图,让论文图表脱颖而出

从‘一片蓝’到‘五彩斑斓’:科研级Matlab三维柱状图视觉优化全攻略 当审稿人翻开一篇论文时,图表往往是他们最先注意到的元素。我曾参与过多次学术期刊的评审工作,那些配色考究、细节精致的图表总能在第一时间抓住眼球——这不仅仅是审美问题…...

收藏!小白也能看懂大模型:从入门到实战的AI学习指南

2026年春招中,AI岗位激增12倍,平均月薪超6万元,成为企业争夺焦点。大模型算法、多模态技术等前沿领域人才需求暴涨,AI已从实验室概念进入规模化落地阶段。教育体系面临挑战,需提前培养AI启蒙能力,打破传统专…...

ESP32-S3-DevKitC-1 v1.8开箱实测:从驱动安装到‘Hello World’串口打印全记录

ESP32-S3-DevKitC-1 v1.8实战指南:从开箱到首个串口通信项目 第一次拿到ESP32-S3-DevKitC-1开发板时,那种既兴奋又略带忐忑的心情记忆犹新。作为乐鑫科技推出的新一代Wi-Fi蓝牙双模开发板,ESP32-S3系列在性能和外设支持上都有显著提升&#x…...

收藏!2026大厂AI招聘火爆:日薪5000抢博士,普通岗简历石沉大海?小白程序员必看生存指南

2026年大厂招聘季AI岗位需求暴涨215%,字节日薪5000抢清北博士,阿里AI岗占offer六成。AI核心岗位年薪可达百万,供需比仅0.15。非AI岗位受冲击,但AIGC产品经理、AI运营等潜力岗位升温。求职者需注重顶会论文、开源贡献等加分项&…...

如何用LDBlockShow高效绘制连锁不平衡热图:从入门到精通的完整指南

如何用LDBlockShow高效绘制连锁不平衡热图:从入门到精通的完整指南 【免费下载链接】LDBlockShow LDBlockShow: a fast and convenient tool for visualizing linkage disequilibrium and haplotype blocks based on VCF files 项目地址: https://gitcode.com/gh_…...

AI编程助手规则动态管理:Cursor智能规则引擎实战指南

1. 项目概述:一个为AI编程助手“量身定制”的规则管家如果你和我一样,日常重度依赖 Cursor 这类 AI 编程助手来提升开发效率,那你肯定也遇到过类似的困扰:项目初期精心编写的.cursorrules文件,随着项目迭代、新成员加入…...

告别重复图片困扰:AntiDupl.NET开源工具助你3步清理数字垃圾

告别重复图片困扰:AntiDupl.NET开源工具助你3步清理数字垃圾 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾经花费数小时整理电脑中的照片&#x…...

独立开发者如何借助多模型选型能力为产品选择最佳AI引擎

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何借助多模型选型能力为产品选择最佳AI引擎 对于独立开发者而言,为产品选择一个合适的AI模型引擎是一项关…...

如何快速实现OBS多平台直播:obs-multi-rtmp完全配置指南

如何快速实现OBS多平台直播:obs-multi-rtmp完全配置指南 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 你是否厌倦了每次直播都要在不同平台间反复切换设置?obs…...

面壁智能开源端侧多模态大模型MiniCPM-V 4.6,性能登顶同尺寸榜首,降低开发门槛

【导语:5月13日,面壁智能联合清华大学与OpenBMB开源社区,发布并开源新一代端侧多模态大模型MiniCPM-V 4.6。该模型以轻量级参数实现性能与效率突破,在评测中超越竞品,还降低了运行内存需求和计算成本,支持多…...

castAR混合现实头显:从光学投影到空间锚定的技术解析

1. 项目概述:从Kickstarter到技术现实,castAR的独特魅力2013年,当Oculus Rift在虚拟现实领域掀起第一波热潮时,一封来自技术爱好者的邮件,将一个名为castAR的项目推到了我的视野中心。这不仅仅是一个头戴显示设备&…...

苹果将在培训应用中采用AI生成主播,解决传统培训规模化与个性化难题

苹果培训应用引入AI生成主播据9to5mac报道,Aaron Perris在X平台披露,苹果公司将很快在其内部培训应用“Apple Sales Coach”中采用AI生成主播,用于制作销售培训视频。该应用由苹果此前的“SEED”应用更新而来,旨在向全球苹果销售合…...

基于Hetzner GPU云服务器与Ollama部署私有AI编程助手实战指南

1. 项目概述与核心价值最近在折腾一个事儿:把我自己用的AI编程助手,从本地电脑搬到云服务器上去。这事儿听起来有点技术含量,但其实核心逻辑很简单——本地电脑的显卡(尤其是消费级的)跑大模型,要么慢&…...

边缘AI技术原理与实战:从模型轻量化到医疗零售场景落地

1. 项目概述:为什么“边缘AI”正在重塑我们的世界最近几年,我身边越来越多的工程师朋友,从云端AI的狂热转向了“边缘AI”的务实探索。这不仅仅是技术潮流的转向,更像是一场静悄悄的革命。简单来说,边缘AI就是把原本需要…...

告别付费困扰:Linux与Windows双平台免费获取Typora全攻略

1. Typora收费后的免费替代方案 Typora作为一款广受欢迎的Markdown编辑器,突然宣布收费让很多用户措手不及。作为一名长期使用Typora的技术写作者,我完全理解大家的心情。好消息是,我们完全可以在不违反软件许可协议的前提下,继续…...

ArcGIS Pro新手教程:用‘创建常量栅格’和‘镶嵌’工具,5步精准提取中国区域气温NC数据

ArcGIS Pro精准提取中国区域气温数据的5步进阶指南 当全球气象数据遇上区域研究需求,如何高效提取目标范围信息成为地理信息科学领域的常见挑战。以中国陆地区域气温分析为例,传统方法往往面临数据冗余、边界锯齿和格式转换三大痛点。本文将揭示一套基于…...

基于Claude API的AI应用开发:claude-toolshed框架实战指南

1. 项目概述与核心价值最近在折腾AI应用开发,特别是围绕Claude API构建一些自动化工具时,发现了一个挺有意思的开源项目——aksh-3141/claude-toolshed。这名字直译过来是“Claude的工具棚”,听起来就挺接地气的。简单来说,它不是…...

087、Python并发编程:队列Queue与线程安全

087、Python并发编程:队列Queue与线程安全 上周排查一个线上问题,服务端处理传感器上报数据时偶尔会丢失几条。日志里没报错,但计数器就是对不上。最后定位到是多个工作线程共用一个列表,其中一个线程在遍历时,另一个线程正好删除了元素——经典的多线程数据竞争问题。这…...

用手机遥控电脑演讲:开源项目Presentation-Control部署与实战指南

1. 项目概述与核心价值最近在准备一个重要的线上技术分享,过程中遇到了一个几乎所有演讲者都会头疼的问题:如何优雅地控制幻灯片播放,同时又能自如地操作电脑上的其他演示工具,比如代码编辑器、终端或者在线Demo?传统的…...

086、Python数据压缩与归档:zipfile与tarfile实战笔记

086、Python数据压缩与归档:zipfile与tarfile实战笔记 一、从线上故障说起 上周排查一个生产环境问题:某服务每天生成的日志文件把磁盘撑满了。 查看代码发现,开发同事用 open().write() 直接写文本,一年下来积累了上千个文件。 其实这类场景最适合用压缩归档——既节省空…...

别再花冤枉钱!手把手教你用Arduino+ESP32自制车机CAN模拟器(附开源代码)

用ArduinoESP32打造高性价比CAN总线模拟器:从硬件搭建到报文解析全指南 在汽车电子和工业控制领域,CAN总线作为可靠的通信标准已经存在三十余年。面对市面上动辄上千元的商业CAN模拟器,许多开发者、学生和DIY爱好者常常望而却步。实际上&…...