dataframe在Mysql中批量修改——pymysql、pandas

本文介绍了一种通过创建临时表并利用pymysql模块批量更新数据库特定字段的方法,避免了使用for循环逐一更新带来的效率问题。
根据id修改数据库的某一列(for 循环执行语句大批量修改是不行的)

1、连接数据库(用root权限,权限不够创建表等操作会出问题)
2、sql语句
  ①创建临时表(关键字Temporary,处理完自动删除的表)
  ②批量插入临时表,ID是int类型也用%s(用到了pymysql的excutemany)
    dataframe转化成特殊list类型
  ③根据ID修改操作的字段,我这里是nlp_name_semantics_v3
3、pymysql执行sql语句



#本地测试数据库
conn = pymysql.connect(host='127.0.0.3', port=3306, user='root', passwd='123456789', db='test',charset='utf8')

# 使用cursor()方法获取操作游标
cur = conn.cursor()
#sql语句                                                主键        操作字段
sql_update1 = "create TEMPORARY table tmp(id int(11) PRIMARY KEY ,nlp_name_semantics_v3 varchar(255))"
sql_update2 = "insert into 临时表 values (%s, %s);"

#这个格式很重要,dataframe是不能当此处参数格式的
param = data[['id','nlp_name_semantics_v3']].values.tolist()

sql_update3 = "update 修改表 as x, 临时表 as t \
             set x.nlp_name_semantics_v3=t.nlp_name_semantics_v3 \
             where x.id=t.id;"
#操作数据库
try:
    cur.execute(sql_update1)               #向sql语句传递参数
    cur.executemany(sql_update2,param)
    cur.execute(sql_update3)
    conn.commit()
except Exception as e:
    #错误回滚
    conn.rollback()
    print('发生错误,已经回滚')
finally:
    conn.close()
### 替换 MySQL 中的数据使用 Pandas DataFramePandas 中,`to_sql()` 方法提供了多种选项来处理数据写入到 SQL 数据库的情况。当目标是替换 MySQL 表中的现有数据时,可以通过设置参数 `if_exists='replace'` 来实现这一功能。 以下是具体的操作方式: #### 使用 `to_sql()` 方法替换表中的数据 通过指定 `if_exists='replace'` 参数,可以删除现有的表并创建一个新的表,新表的内容由当前的 DataFrame 提供[^3]。此过程会完全覆盖原始表及其结构。 ```python import pandas as pd from sqlalchemy import create_engine # 创建连接引擎 (假设已安装 pymysql 驱动) engine = create_engine('mysql+pymysql://username:password@host:port/database_name') # 假设有一个名为 df 的 DataFrame df.to_sql(name='table_name', con=engine, if_exists='replace', index=False) ``` - **name**: 要写入的目标表名。 - **con**: SQLAlchemy 引擎或连接对象。 - **if_exists**: 控制行为的方式,可选值有 `'fail'`, `'replace'`, 和 `'append'`。这里我们选择了 `'replace'`。 - **index**: 如果为 True,则将 DataFrame 的索引作为单独的一列写入;如果为 False,则不写入索引[^4]。 需要注意的是,在执行上述操作之前,应该确认是否有其他进程依赖于该表的存在以及其内容和结构。因为 `'replace'` 模式不仅清除了旧数据还会重建整个表定义。 另外一种情况可能是只希望更新部分记录而不是重新构建整个表。这种情况下可能需要用到更复杂的逻辑或者借助数据库本身的特性比如 UPSERT 功能(即插入不存在的行而修改存在的行),但这超出了单纯调用 `pandas.DataFrame.to_sql` 所能完成的功能范围。 #### 注意事项 对于大规模数据集来说,频繁地采用 'replace' 方式可能会带来性能上的开销,因为它涉及到先删再建的过程。因此实际应用中需权衡利弊决定最佳策略。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值