利用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进阶教程之异常处理
Aug 30 Python
python通过pil将图片转换成黑白效果的方法
Mar 16 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
Apr 20 Python
Python模拟登录验证码(代码简单)
Feb 06 Python
Python 最大概率法进行汉语切分的方法
Dec 14 Python
解决python文件双击运行秒退的问题
Jun 24 Python
python中dict使用方法详解
Jul 17 Python
python障碍式期权定价公式
Jul 19 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 Python
PyTorch里面的torch.nn.Parameter()详解
Jan 03 Python
解决pycharm下pyuic工具使用的问题
Apr 08 Python
pycharm2020.2 配置使用的方法详解
Sep 16 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中的错误处理、异常处理机制分析
2012/05/07 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
浅谈PHP解析URL函数parse_url和parse_str
2014/11/11 PHP
PHP中的闭包(匿名函数)浅析
2015/02/07 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
2020/02/10 PHP
5 cool javascript apps
2007/03/24 Javascript
javascript 异常处理使用总结
2009/06/21 Javascript
JS正则中的RegExp对象对象
2012/11/07 Javascript
jQuery Animation实现CSS3动画示例介绍
2013/08/14 Javascript
node.js中watch机制详解
2014/11/17 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
JavaScript实现重置表单(reset)的方法
2015/04/02 Javascript
浅析JS运动
2015/12/28 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
2016/05/31 Javascript
详解关于Vue版本不匹配问题(Vue packages version mismatch)
2018/09/17 Javascript
在小程序中使用canvas的方法示例
2018/09/17 Javascript
zepto.js 实时监听输入框的方法
2018/12/04 Javascript
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
javascript获取元素的计算样式
2019/05/24 Javascript
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
Python 正则表达式的高级用法
2016/12/04 Python
Python中查看文件名和文件路径
2017/03/31 Python
详解Python中的type和object
2018/08/15 Python
pandas 条件搜索返回列表的方法
2018/10/30 Python
pytorch获取模型某一层参数名及参数值方式
2019/12/30 Python
Python随机数函数代码实例解析
2020/02/09 Python
python-地图可视化组件folium的操作
2020/12/14 Python
Python调用系统命令os.system()和os.popen()的实现
2020/12/31 Python
Python基于爬虫实现全网搜索并下载音乐
2021/02/14 Python
东方通信股份有限公司VC面试题
2014/08/27 面试题
教师年度个人总结
2015/02/11 职场文书
太空授课观后感
2015/06/17 职场文书
农村婚礼司仪主持词
2015/06/29 职场文书
总结Python变量的相关知识
2021/06/28 Python