python 删除大表数据

本文介绍了一个Python脚本,用于连接MySQL数据库,执行数据查询,将数据从tb_bigtable_statistic表备份到tb_bigtable_statistic_hist表,并删除源表中超过93天的数据。涉及Python的pymysql模块使用,时间戳转换,SQL语句执行及事务处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/usr/bin/env python
# encoding: utf-8

#@author: 东哥加油!
#@file: del_tb_bigtable_statistic.py
#@time: 2018/11/21 15:39


import pymysql
import datetime
import math
import time


#获取连接
def get_conn():
    conn = None
    try:
        conn = pymysql.connect(
            host="192.168.1.2",
            port=3306,
            user="root",
            passwd="mysqlpassword",
            charset="utf8",
        )
    except Exception as err:
        print(err)
    return conn

#查询语句执行
def get_data(sql):
    conn = get_conn()
    cur = conn.cursor()
    cur.execute(sql)
    data = cur.fetchall()
    conn.close()
    return data




#93天前的时间戳
# 2018-07-24 00:00:00 转成毫秒时间戳
def get_pdate_begin(xday):
    now_time = datetime.datetime.now()
    step_time = datetime.timedelta(days=xday)
    yes_time = now_time - step_time
    pdate = yes_time.strftime('%Y%m%d')
    print(pdate)
    return pdate



#数据备份,放到tb_bigtable_statistic_hist表中
def data_bak(xday):
    print("开始时间:",time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
    conn = get_conn()
    cur = conn.cursor()
    cidlist = data_zk(xday)
    if cidlist == 0:
        print('当天无数据')
    else:
        for cids in cidlist:
            try:
                sql = '''insert into db_order.tb_bigtable_statistic_hist \
        select * from db_order.tb_bigtable_statistic \
        where cid in( %s )''' % cids
                cur.execute(sql)
                conn.commit()

            except:
                print('备份失败!!!')
                conn.rollback()
                conn.close()
                exit(99)
        conn.close()
        print("结束时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))




#组装cid成in的条件(....),5000个cid为一组
def data_zk(xday):
    conn = get_conn()
    cur = conn.cursor()
    cid = get_cid(xday)
    var1 = "-999"
    i = 0
    list = []
    if cid.__len__() > 0:
        for one in cid:
            var1=var1+","+str(one[0])
            i=i+1
            if(i==2000):
                list.append(var1)
                var1 = "-999"
                i=0
        list.append(var1)
        return list
    else:
        return 0

#获取该条件所有的cid
def get_cid(xday):
    pdate = get_pdate_begin(xday)
    sql = '''SELECT cid
    FROM db_order.tb_bigtable_statistic 
    WHERE pdate = %s limit 20000''' % (pdate)
    cid = get_data(sql)
    return cid

#删除数据
def del_data(xday):
    print("删除开始时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
    conn = get_conn()
    cur = conn.cursor()
    cidlist = data_zk(xday)
    if cidlist == 0:
        print('当天无数据')
    else:
        for cids in cidlist:
            try:
                sql = '''delete from db_order.tb_bigtable_statistic \
        where cid in( %s )''' % cids
                cur.execute(sql)
                conn.commit()

            except:
                print('备份失败!!!')
                conn.rollback()
                conn.close()
                exit(99)
        conn.close()
        print("删除结束时间:", time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

def move_data(xday):
    data_bak(xday)
    del_data(xday)


if __name__ == '__main__':
    move_data(93)

  

转载于:https://www.cnblogs.com/52shaidan/p/10106508.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值