利用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 相关文章推荐
java直接调用python脚本的例子
Feb 16 Python
Django在Win7下的安装及创建项目hello word简明教程
Jul 14 Python
Python深入学习之闭包
Aug 31 Python
Python类定义和类继承详解
May 08 Python
Python外星人入侵游戏编程完整版
Mar 30 Python
python实现本地图片转存并重命名的示例代码
Oct 27 Python
python3中property使用方法详解
Apr 23 Python
python调试神器PySnooper的使用
Jul 03 Python
Python 正则表达式爬虫使用案例解析
Sep 23 Python
python3 mmh3安装及使用方法
Oct 09 Python
Python configparser模块配置文件过程解析
Mar 03 Python
python​格式化字符串
Apr 20 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
古巴咖啡 Cubita琥爵咖啡 独特的加勒比海风味咖啡
2021/03/06 新手入门
BBS(php & mysql)完整版(四)
2006/10/09 PHP
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
php自定义函数截取汉字长度
2014/05/15 PHP
浅析php工厂模式
2014/11/25 PHP
PHP中4种常用的抓取网络数据方法
2015/06/04 PHP
JavaScript的面向对象(一)
2006/11/09 Javascript
jquery 笔记 事件
2011/11/02 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
2016/12/13 Javascript
AngulerJS学习之按需动态加载文件
2017/02/13 Javascript
javascript函数的节流[throttle]与防抖[debounce]
2017/11/15 Javascript
详解VUE 数组更新
2017/12/16 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
jquery中attr、prop、data区别与用法分析
2019/09/25 jQuery
Python新手们容易犯的几个错误总结
2017/04/01 Python
python构建自定义回调函数详解
2017/06/20 Python
在java中如何定义一个抽象属性示例详解
2017/08/18 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
简单的Python调度器Schedule详解
2019/08/30 Python
python进程间通信Queue工作过程详解
2019/11/01 Python
python函数调用,循环,列表复制实例
2020/05/03 Python
python读取hdfs上的parquet文件方式
2020/06/06 Python
Pycharm 设置默认解释器路径和编码格式的操作
2021/02/05 Python
乌克兰香水和化妆品网站:Notino.ua
2018/03/26 全球购物
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
大课间活动实施方案
2014/03/06 职场文书
中学教师师德承诺书
2014/05/23 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
给客户的感谢信
2015/01/21 职场文书
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技