python 使用连接池、分批处理mysql遍历每个表格,表格要加反引号根据trade_date降序排列,对net_mf_amount列的前一天的数据减去今天的数据放在a列,如果a列的值存在,则计算下一个日期的值,避免重复计算,并且保存
时间: 2024-02-09 18:10:54 浏览: 71
python 使用连接池操作mysql数据库(示例)
好的,关于你的问题,我可以给你一些思路和代码实现。
首先需要连接池,可以使用第三方库`pymysql`和`DBUtils`来实现:
```python
import pymysql
from dbutils.pooled_db import PooledDB
pool = PooledDB(
creator=pymysql, # 使用pymysql作为连接库
maxconnections=5, # 连接池最大连接数
mincached=2, # 初始化时,连接池中至少创建的空闲连接,0表示不创建
maxcached=5, # 连接池中最多闲置的连接,0表示不限制
maxshared=0, # 连接池中最多共享的连接数量,0表示全共享
blocking=True, # 连接池中如果没有可用连接后,是否阻塞等待
maxusage=None, # 一个连接最多被重复使用多少次,None表示不限制
setsession=[], # 连接建立后需要执行的命令列表
ping=0, # ping MySQL服务器检查是否服务可用,0表示不检查,1表示检查
host='127.0.0.1',
port=3306,
user='root',
password='root',
database='test'
)
conn = pool.connection() # 从连接池中获取一个连接
cursor = conn.cursor()
```
然后需要分批处理每个表格,可以使用`show tables`命令获取所有表格,再使用`desc tablename`命令获取表格结构,最后使用`select`命令遍历每个表格的数据:
```python
cursor.execute("show tables;")
tables = cursor.fetchall()
for table in tables:
table = table[0]
cursor.execute(f"desc {table};")
columns = [column[0] for column in cursor.fetchall()]
columns_str = ",".join([f"`{column}`" for column in columns])
cursor.execute(f"select {columns_str} from `{table}` order by `trade_date` desc;")
results = cursor.fetchall()
if 'a' not in columns:
cursor.execute(f"alter table `{table}` add column `a` double;")
for i in range(len(results)):
if i == 0:
continue
if results[i][columns.index('a')] != 0:
continue
prev_net_mf_amount = results[i-1][columns.index('net_mf_amount')]
curr_net_mf_amount = results[i][columns.index('net_mf_amount')]
diff = prev_net_mf_amount - curr_net_mf_amount
results[i] = results[i][:columns.index('a')] + (diff,) + results[i][columns.index('a')+1:]
cursor.execute(f"update `{table}` set `a` = {diff} where `id` = {results[i][0]};")
conn.commit()
cursor.close()
conn.close()
```
完整的代码如上所示。
这里的处理方式是,先判断表格中是否存在`a`列,如果不存在则添加一个双精度浮点类型的`a`列。然后遍历表格中的每条数据,如果当前行的`a`列值不为`0`,则说明已经计算过,跳过当前行。否则,计算当前行的`a`列值,并将结果更新到数据库中。这里需要使用事务来保证数据的一致性,如果一次更新多行数据时出现了错误,可以回滚之前的操作。
希望能对你有所帮助!
阅读全文