首页 > 数据库 >Mysql新增分区-Python版

Mysql新增分区-Python版

时间:2023-10-23 18:13:38浏览次数:47  
标签:name get Python 分区 partition datetime str Mysql date

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)

  

标签:name,get,Python,分区,partition,datetime,str,Mysql,date
From: https://www.cnblogs.com/lytcreate/p/17783114.html

相关文章

  • mysql 自定义函数的调用及赋值
    函数调用:select函数名(参数);函数返回值赋值:set变量名=(select函数名(参数));select函数名(参数)into变量名;示例:自定义函数内容 selecttest4(5)intoaa;setbb=(selecttest4(10));selectaa,bb; ......
  • mysql log_bin_trust_function_creators
    原文链接:https://blog.csdn.net/ayqy42602/article/details/98770328在本地Mysql中创建函数时,报错如下:thisfunctionhasnoneofdeterministic,nosql,orreadssqldatainitsdeclarationandbinaryloggingisenabled(you*might*wanttousethelesssafelog_bin_......
  • 【文心一言】百度千帆 Python 和 JavaScript 调用上下文 API
    接口为:百度ERNIE-Bot-4(邀测)控制台直达链接JavascriptconstAK="urAK"constSK="urSK"constaxios=require("axios").default;letaccess_token="urtoken"varurl='https://aip.baidubce.com/rpc/2.0/ai_custom/v1/w......
  • 【Python微信机器人】第二篇:将python注入到其他进程
    目录修整目前的系列目录(后面会根据实际情况变动):在windows11上编译python将python注入到其他进程并运行使用C++写一个python的pyd库,用于实现inlinehookPythonctypes库的使用使用ctypes主动调用进程内的任意函数使用汇编引擎调用进程内的任意函数(为了调用不遵守任何一......
  • Python生成器
    Python生成器1、什么是生成器根据程序员制定的规则循环生成数据,当规则不成立时则生成数据结束。数据不是一次性全部生成出来的,而是使用一个,再生成一个,可以节约大量的内存。创建生成器的方式:①生成器推导式②yield关键字2、生成器推导式#创建生成器#生成器推导式=》(......
  • Python:深拷贝与浅拷贝
    python:深拷贝与浅拷贝一、了解几个概念变量:是一个系统表的元素,拥有指向对象的连接空间对象:被分配的一块内存,存储所代表的值引用:是自动形成的从变量到对象的指针类型:属于对象,而非变量不可变对象:一旦创建就不可修改的对象(值内存地址固定后不可以再修改其值),包括字符......
  • Mysql隔离事务
    1.四大隔离事务 类型一:RU(READ-UNCOMMITTED表示读未提交)可以读取到事务未提交的数据,隔离性差,会出现脏读(当前内存读),不可重复读,幻读问题;类型二:RC(READ-COMMITTED表示读已提交)可以读取到事务已提交的数据,隔离性一般,不会出现脏读问题,但是会出现不可重复读,幻读问题;类型......
  • 栩栩如生,音色克隆,Bert-vits2文字转语音打造鬼畜视频实践(Python3.10)
    诸公可知目前最牛逼的TTS免费开源项目是哪一个?没错,是Bert-vits2,没有之一。它是在本来已经极其强大的Vits项目中融入了Bert大模型,基本上解决了VITS的语气韵律问题,在效果非常出色的情况下训练的成本开销普通人也完全可以接受。BERT的核心思想是通过在大规模文本语料上进行无监督预......
  • python通过脚本路径获取对应脚本里的内容
    importinspectfromimportlib.utilimportspec_from_file_location,module_from_specscript_path="test.py"spec=spec_from_file_location("test",script_path)module=module_from_spec(spec)spec.loader.exec_module(module)print(modul......
  • python 计算指定日期是今年的第几周和这个月的第几周
    Python当前时间是一年中第几周_python计算一年的第几周-CSDN博客以上感觉可能索引是从0开始ISO8601每个日历星期从星期一开始,星期日为第7天。第一个日历星期有以下四种等效说法:1,本年度第一个星期四所在的星期;2,1月4日所在的星期;3,本年度第一个至少有4天在同一星期内的星......