PostgreSQL引进“分区”表特性,解放了之前采用“表继承”+“触发器”来实现分区表的繁琐、低效。而添加分区,都是手动执行SQL。

演示目的:利用python来为PostgreSQL的表自动添加分区。
python版本:python3+

pip3 install psycopg2

一、配置数据源

database.ini 文件:记录数据库连接参数

[adsas]host=192.168.1.201database=adsasuser=adsaspassword=adsas123port=5432[test]host=192.168.1.202database=adsasuser=adsaspassword=adsas123port=5432

二、config 脚本

config.py 文件:下面的 config() 函数读取 database.ini 文件并返回连接参数。config() 函数位于config.py文件中

#!/usr/bin/python3from configparser import ConfigParser def config(section ,filename='database.ini'):  # create a parser  parser = ConfigParser()  # read config file  parser.read(filename)   # get section, default to postgresql  db = {}  if parser.has_section(section):    params = parser.items(section)    for param in params:      db[param[0]] = param[1]  else:    raise Exception('Section {0} not found in the {1} file'.format(section, filename))   return db

三、创建子表脚本

pg_add_partition_table.py 文件:其中 create_table函数是创建子表SQL。其中参数

参数名 含义
db 指向数据库
table 主表
sub_table 正要新建的子表名
start_date 范围分界开始值
end_date 范围分界结束值

#!/usr/bin/python3import psycopg2from config import config#example: create table tbl_game_android_step_log_2021_07 PARTITION OF tbl_game_android_step_log FOR VALUES FROM ('2021-07-01') TO ('2021-08-01');def create_table(db, table, sub_table, start_date, end_date):  """ create subtable in the PostgreSQL database"""  command = "create table {0} PARTITION OF {1} FOR VALUES FROM ('{2[0]}') TO ('{2[1]}');".format(sub_table, table, (start_date, end_date))   conn = None  try:    # read the connection parameters    params = config(section = db)    # connect to the PostgreSQL server    conn = psycopg2.connect(**params)    cur = conn.cursor()    # create table one by one    cur.execute(command)    # close communication with the PostgreSQL database server    cur.close()    # commit the changes    conn.commit()  except (Exception, psycopg2.DatabaseError) as error:    print(error)  finally:    if conn is not None:      conn.close()

四、执行文件main.py

main.py:主文件;通过执行main生成分区表。

示例:

#!/usr/bin/python3import datetimefrom datetime import datefrom dateutil.relativedelta import *from pg_add_partition_table import create_table#Get the 1st day of the next monthdef get_next_month_first_day(d):  return date(d.year + (d.month == 12), d.month == 12 or d.month + 1 , 1)  def create_sub_table(db, table):  # Get current date  d1 = date.today()  # Get next month's date  d2 = d1 + relativedelta(months=+1)  # Get the 1st day of the next month;As the starting value of the partitioned table  start_date = get_next_month_first_day(d1)  # Gets the 1st of the next two months as the end value of the partitioned table  end_date = get_next_month_first_day(d2)  # get sub table name  getmonth = datetime.datetime.strftime(d2, '%Y_%m')  sub_table = table + '_' + getmonth  create_table(db, table, sub_table, start_date, end_date) if __name__ == '__main__':  create_sub_table('test', 'tbl_game_android_step_log');

上面示例单独为表tbl_game_android_step_log;创建分区;若多个表;用for语句处理

# 多表操作  for table in ['tbl_game_android_step_log', 'tbl_game_android_game_log','tbl_game_android_pay_log']:    create_sub_table('test', table);演示之前:adsas=> select * from pg_partition_tree('tbl_game_android_step_log');        relid        |    parentrelid    | isleaf | level -----------------------------------+---------------------------+--------+------- tbl_game_android_step_log     |              | f   |   0 tbl_game_android_step_log_2020_12 | tbl_game_android_step_log | t   |   1(2 rows)

演示之后:

adsas=> select * from pg_partition_tree('tbl_game_android_step_log');        relid        |    parentrelid    | isleaf | level -----------------------------------+---------------------------+--------+------- tbl_game_android_step_log     |              | f   |   0 tbl_game_android_step_log_2020_12 | tbl_game_android_step_log | t   |   1 tbl_game_android_step_log_2021_01 | tbl_game_android_step_log | t   |   1Partition key: RANGE (visit_time)Partitions: tbl_game_android_step_log_2020_12 FOR VALUES FROM ('2020-12-01 00:00:00') TO ('2021-01-01 00:00:00'),      tbl_game_android_step_log_2021_01 FOR VALUES FROM ('2021-01-01 00:00:00') TO ('2021-02-01 00:00:00')

到此这篇关于利用python为PostgreSQL的表自动添加分区的文章就介绍到这了,更多相关python PostgreSQL添加分区内容请搜索乐虎体育以前的文章或继续浏览下面的相关文章希望大家以后多多支持乐虎体育!

利用python为PostgreSQL的表自动添加分区的更多相关文章

  1. python中编写函数并调用的知识点总结

    能够调用自己编写的函数,这在很多开发语言中,都会用到一个叫做mian的主函数,这个函数一般都是程序的入口,当程序启动时,首先执行这个函数。在Python中,main函数的主要作用就是你写的模块既可以导入到别的模块中用,也可以在模块本身执行使用。下面就来了解具体使用操作吧。编写简单的函数并调用:def......

  2. python使用scapy模块实现ARP扫描的过程

    前言上篇文章主要写了利用scapy实现ping扫描,这篇文章主要是利用scapy模块实现内网ARP扫描实现过程上篇文章中介绍了通过scapy来伪造包,那么ARP包的伪造过程这里不再详述,说一工具的简单整体流程1.首先,实现单个IP的ARP包的发送和接收2.其次,实现多进程同时多个ARP包的发送和接收......

  3. 使用fdopen对python进程产生的文件进行权限最小化配置

    通过一定的文件访问权限的指定,我们可以使用fdopen来替代经常使用的内置的open库,来进行文件的创建和读写的操作,这使得我们可以在文件创建的时候就指定好权限配置,避免在创建后再对其进行修改。需求背景用python进行文件的创建和读写操作时,我们很少关注所创建的文件的权限配置。对于一些安全性较高的......

  4. python 爬取知乎回答下的微信8.0状态视频

    微信 8.0 版本更新后,可以设置个人状态,状态里面可以添加火录制视频,很快状态视频就火了,可以看下知乎热榜有没有微信8.0状态沙雕又可爱的视频或图片?[1]。比如我也设置了一个:于是我就想把这些视频下载下来,也玩一玩。本文讲述如何使用 Python 一键下载知乎某个回答下的所有视频。思路:分析知乎......

  5. pandas读取excel,txt,csv,pkl文件等命令的操作

    pandas读取txt文件读取txt文件需要确定txt文件是否符合基本的格式,也就是是否存在\t,,,等特殊的分隔符一般txt文件长成这个样子txt文件举例下面的文件为空格间隔1 2019-03-22 00:06:24.4463094 中文测试 2 2019-03-22 00:06:32.45656......

  6. python使用numpy中的size()函数实例用法详解

    在python中,提到如何计算多维数组和矩阵,那一定会想到numpy。numpy定义了矩阵和数组,为它们提供了相关的运算。size中文解释为大家、尺寸的意思,如果想要统计矩阵元素个数,使用size()函数就可以解决。1、Numpy size()函数主要是用来统计矩阵元素个数,或矩阵某一维上的元素个数......

  7. Python用requests库爬取返回为空的解决办法

    首先介?一下我??用360搜索派取城市排名前20。我们爬取的网址:https://baike.so.com/doc/24368318-25185095.html我们要爬取的内容:html字段:robots协议:现在我们开始用python IDLE 爬取import requestsr = reque......

  8. Python实现微信表情包炸群

    Python实现微信表情包炸群# -*- coding = utf-8 -*- # @Time : 2021/1/26 15:19 # @Author : 陈良兴# @File : 微信表情包炸群.py# @Software : PyCharm# 运行程序 > 输入次数 > 回车 >......

  9. 剪枝决策树原理与Python实现

    机器学习经典模型决策树的实现原理,以及Python实现目录一、决策树模型 二、选择划分 2.1 信息熵和信息增益 2.2 增益率 2.3 基尼指数 三、剪枝 3.1 预剪枝 3.2 后剪枝 3.3 剪枝示例 3.4 预剪枝和后剪枝对比 四、Python实现 4.1 基尼值和基尼指数 4.2 选择划分......

  10. python实现自幂数的示例代码

    1、什么是自幂数?前文介绍过 python 实现水仙花数,其实水仙花数为自幂数的一种,即,3位自幂数。自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。(例如:当n为3时,有1^3 + 5^3 + 3^3 = 153,153即是n为3时的一个自幂数)自幂数-百度百科2、自幂......

随机推荐

  1. Python爬虫scrapy框架Cookie池(微博Cookie池)的使用

    下载代码Cookie池(这里主要是微博登录,也可以自己配置置其他的站点网址)下载代码GitHub:https://github.com/Python3WebSpider/CookiesPool下载安装过后注意看网页下面的相关基础配置和操作!!!!!!!!!!!!!自己的设置主要有下面几步:1、配置其......

  2. js简单粗暴的发布订阅示例代码

    什么是发布/订阅?我打个比方,你去某个门店买衣服,你和门店店长相互并不认识,门店店长只管卖他的衣服,并不关心是谁来买,而你也只管买你想要的衣服,并不关心是哪个门店在卖,这时,门店和你就组成了一个发布/订阅的关系。当门店挂出衣服款式,你去找你想要的衣服,如果找到了,那就买下来,如果没找到,那就离开这家......

  3. C# Winform 实现控件自适应父容器大小的示例代码

    在日常开发中经常遇到控件不能随着父容器大小的改变而且自动改变控件的所在位置和大小。以下是实现的代码/// <summary>/// 根据父容器实现控件自适应大小位置/// </summary>/// <param name="control">......

  4. php中PHPUnit框架实例用法

    本期给大家带来的框架是一个单元测试内容,本身不是很难的东西,大家觉得困难,可能是把自己框在了技术上,事实上,并非如此,我们没有设置好一个项目,不一定是自己的技术不达标,更多可能也许是对一个项目时间的安排的衡量和考虑并不全面,下面就大家遇到的一些问题,给大家编写以下内容,供大家参考。安装:compos......

  5. 【Android初级】使用setContentView实现页面的转换效果(附源码)

    一提到Android中页面的切换,你是不是只想到了startActivity启动另一个Activity?其实在Android中,可以直接利用setContentView达到类似页面转换效果的!实现思路如下:在第一个Activity的布局中添加一个Button,实现点击事件点击该Button,调用se......

  6. 使用 C# 9 的records作为强类型ID - JSON序列化

    在本系列的上一篇文章中,我们注意到强类型ID的实体,序列化为 JSON 的时候报错了,就像这样:{"id": {"value": 1},"name": "Apple","unitPrice": 0.8......

  7. c#里面的AES加密解密

    C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现更多1AESJavascriptJavaC#PythonPHPc#里面的AES加密解密在visual studio中写的c#代码using System;using System.Collections.Ge......

  8. JavaScript如何操作css

    原本应该是由css进行控制html中的div的宽高和背景颜色,但是在下方使用了JavaScript进行重新调用了div盒子,并且覆盖了css原本的属性内容。 需求目标:由 100 像素的粉色背景色的div盒子变成了 300像素的橘黄色效果的div盒子 代码如下: ......

  9. php中unable to fork报错简单解决方法

    今天小编遇到一个问题,当调用了system方法,并且执行了shell脚本,开始的时候,一切都非常正常,但是当程序运行后一段时间,出现了显示unable to fork的报错,这个是什么原因呢,后来小编排查了下,主要是因为达到用户的进程上限了,下面小编给大家介绍下解决方式。限制linux用户的进程数修......

  10. Java并发包源码学习系列:阻塞队列实现之ArrayBlockingQueue源码解析

    目录ArrayBlockingQueue概述类图结构及重要字段构造器出队和入队操作入队enqueue出队dequeue阻塞式操作E take() 阻塞式获取void put(E e) 阻塞式插入E poll(timeout, unit) 阻塞式超时获取boolean offer(e, timeout......