利用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 相关文章推荐
python多线程扫描端口示例
Jan 16 Python
Python实现全局变量的两个解决方法
Jul 03 Python
Python实现二分查找算法实例
May 26 Python
python实现的系统实用log类实例
Jun 30 Python
Python的多态性实例分析
Jul 07 Python
解决python中使用plot画图,图不显示的问题
Jul 04 Python
python leetcode 字符串相乘实例详解
Sep 03 Python
Python3内置模块之base64编解码方法详解
Jul 13 Python
django 信号调度机制详解
Jul 19 Python
flask利用flask-wtf验证上传的文件的方法
Jan 17 Python
关于tf.reverse_sequence()简述
Jan 20 Python
python中添加模块导入路径的方法
Feb 03 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获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
简单谈谈php中ob_flush和flush的区别
2014/11/27 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
angular中的http拦截器Interceptors的实现
2017/02/21 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
2020/05/15 Javascript
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
Python中用altzone()方法处理时区的教程
2015/05/22 Python
Python读取一个目录下所有目录和文件的方法
2016/07/15 Python
django创建最简单HTML页面跳转方法
2019/08/16 Python
Python猴子补丁知识点总结
2020/01/05 Python
TensorFLow 不同大小图片的TFrecords存取实例
2020/01/20 Python
pytorch 使用加载训练好的模型做inference
2020/02/20 Python
css3实现元素环绕中心点布局的方法示例
2019/01/15 HTML / CSS
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
武汉世纪畅想数字传播有限公司.NET笔试题
2014/07/22 面试题
六年级学生评语
2014/04/22 职场文书
医德医风演讲稿
2014/05/20 职场文书
酒店管理毕业生自荐信
2014/05/25 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
2014年教研室工作总结
2014/12/06 职场文书
幼儿园中班教师个人总结
2015/02/05 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL
python实现简单的聊天小程序
2021/07/07 Python
Python获取字典中某个key的value
2022/04/13 Python
使用Nginx+Tomcat实现负载均衡的全过程
2022/05/30 Servers
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android