Mysql新增分区-Python版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | import datetime import sys import pandas as pd import pymysql import sqlalchemy.engine.url as engineUrl from sqlalchemy import create_engine DB_INFO = { "host": "IP", "port": 3306, "username": "root", "password": "password", "database": "database name" } def get_db_engine(): db_dict = {'host': DB_INFO.get("host"), 'username': DB_INFO.get("username"), 'password': DB_INFO.get("password"), 'port': DB_INFO.get("port"), 'database': DB_INFO.get("database") } try: db_url = engineUrl.URL.create("mysql+pymysql", **db_dict) except Exception as e: print(e) db_dict['drivername'] = 'mysql+pymysql' db_url = engineUrl.URL(**db_dict) db_engine = create_engine(db_url, pool_pre_ping=True) return db_engine def action(date_str): date_str = datetime.datetime.strptime(date_str, '%Y%m%d') + datetime.timedelta(days=3) show_sql = "show table status;" show_res = pd.read_sql(show_sql, get_db_engine()) # 获取具有分区的表名 show_frame = show_res[show_res["Create_options"] == "partitioned"][["Name", "Create_options"]] name_list = [] for x in show_frame["Name"]: name_list.append(x) print(f"info: 包含分区的表: {name_list}") # 获取分区表的最后一个分区字段 partition_list = [] for name in name_list: last_sql = f"SELECT PARTITION_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE table_name = '{name}' ORDER BY partition_ordinal_position DESC LIMIT 1;" last_res = pd.read_sql(last_sql, get_db_engine()) partition_list.append(last_res["PARTITION_NAME"][0]) partition_dict = dict(zip(name_list, partition_list)) print(f"info: 分区表的最新字段为: {partition_dict}") # 建立数据库连接,read_sql无法执行创建分区 conn = pymysql.connect(host=DB_INFO.get("host"), port=DB_INFO.get("port"), user=DB_INFO.get("username"), password=DB_INFO.get("password"), database=DB_INFO.get("database")) cursor = conn.cursor() for table_name in partition_dict: partition_date = datetime.datetime.strptime(partition_dict.get(table_name).replace("p", ""), '%Y%m%d') while partition_date < date_str: partition_date = partition_date + datetime.timedelta(days=1) partition_date_str = "p" + partition_date.strftime("%Y%m%d") # 8月23日定时任务会完成p20220825的分区创建 partition_end_str = (partition_date + datetime.timedelta(days=1)).strftime("%Y-%m-%d") create_sql = f"ALTER TABLE {table_name} ADD PARTITION (PARTITION {partition_date_str} VALUES LESS THAN (TO_DAYS ('{partition_end_str}')));" try: cursor.execute(create_sql) conn.commit() print(f"success: table: {table_name} 新增分区成功,当前最新分区为: {partition_date_str}") except Exception as e: print(e) print(f"failed: table: {table_name} 新增分区失败,失败分区为:{partition_date_str}") conn.close() if __name__ == "__main__": start_time = datetime.datetime.now() print("任务开始:", start_time) avgs = sys.argv[1:] if len(avgs) > 0: date_str = avgs[0] else: date_str = (datetime.datetime.now() + datetime.timedelta(days=-1)).strftime('%Y%m%d') action(date_str) end_time = datetime.datetime.now() print("任务结束:", end_time - start_time) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix