利用python为PostgreSQL的表自动添加分区


Posted in Python onJanuary 18, 2021

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

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

pip3 install psycopg2

一、配置数据源

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

[adsas]
host=192.168.1.201
database=adsas
user=adsas
password=adsas123
port=5432

[test]
host=192.168.1.202
database=adsas
user=adsas
password=adsas123
port=5432

二、config 脚本

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

#!/usr/bin/python3
from 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/python3

import psycopg2
from 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/python3
import datetime
from datetime import date
from dateutil.relativedelta import *
from pg_add_partition_table import create_table

#Get the 1st day of the next month
def 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   |   1

Partition 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 相关文章推荐
浅谈pandas中shift和diff函数关系
Apr 08 Python
Python之pandas读写文件乱码的解决方法
Apr 20 Python
Python产生Gnuplot绘图数据的方法
Nov 09 Python
PyQt5实现简单数据标注工具
Mar 18 Python
python多线程分块读取文件
Aug 29 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
PYTHON发送邮件YAGMAIL的简单实现解析
Oct 28 Python
关于多元线性回归分析——Python&SPSS
Feb 24 Python
Python opencv相机标定实现原理及步骤详解
Apr 09 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
May 22 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
Nov 13 Python
python套接字socket通信
Apr 01 Python
如何查看python关键字
Jan 17 #Python
Python日志打印里logging.getLogger源码分析详解
Jan 17 #Python
Python中的面向接口编程示例详解
Jan 17 #Python
Python学习之time模块的基本使用
Jan 17 #Python
python中re模块知识点总结
Jan 17 #Python
史上最详细的Python打包成exe文件教程
Jan 17 #Python
python制作微博图片爬取工具
Jan 16 #Python
You might like
php中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
2013/06/27 PHP
php实现的日历程序
2015/06/18 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
Cookie跨域问题解决方案代码示例
2020/11/24 PHP
js获取字符串字节数方法小结
2015/06/09 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
BootStrap Typeahead自动补全插件实例代码
2016/08/10 Javascript
浅谈Vue.js
2017/03/02 Javascript
Angular4实现鼠标悬停3d倾斜效果
2017/10/25 Javascript
Angularjs中的$apply及优化使用详解
2018/07/02 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
JS实现电话号码的字母组合算法示例
2019/02/26 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
vue路由中前进后退的一些事儿
2019/05/18 Javascript
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
jquery.tagsinput.js实现记录checkbox勾选的顺序
2019/09/21 jQuery
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
2020/09/04 Javascript
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
Python中单、双下划线的区别总结
2017/12/01 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
python之生成多层json结构的实现
2020/02/27 Python
python 常用日期处理-- datetime 模块的使用
2020/09/02 Python
python爬虫用scrapy获取影片的实例分析
2020/11/23 Python
python爬取微博评论的实例讲解
2021/01/15 Python
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
探矿工程师自荐信
2014/01/24 职场文书
服务员岗位职责
2014/01/29 职场文书
旅游与酒店管理专业求职信
2014/07/21 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
年底个人总结范文
2015/03/10 职场文书
Python机器学习之基于Pytorch实现猫狗分类
2021/06/08 Python
python的列表生成式,生成器和generator对象你了解吗
2022/03/16 Python
vue实现拖拽交换位置
2022/04/07 Vue.js