利用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 相关文章推荐
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
Apr 11 Python
浅谈利用numpy对矩阵进行归一化处理的方法
Jul 11 Python
Python告诉你木马程序的键盘记录原理
Feb 02 Python
python爬虫爬取微博评论案例详解
Mar 27 Python
深入浅析python3中的unicode和bytes问题
Jul 03 Python
python 比较2张图片的相似度的方法示例
Dec 18 Python
pytorch实现建立自己的数据集(以mnist为例)
Jan 18 Python
python实现TCP文件传输
Mar 20 Python
在PyTorch中使用标签平滑正则化的问题
Apr 03 Python
Python入门之使用pandas分析excel数据
May 12 Python
Python实现Hash算法
Mar 18 Python
Python必备技巧之字符数据操作详解
Mar 23 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模板引擎SMARTY
2006/10/09 PHP
openPNE常用方法分享
2011/11/29 PHP
php实现根据词频生成tag云的方法
2015/04/17 PHP
微信公众号开发之文本消息自动回复php代码
2016/08/08 PHP
广告显示判断
2006/08/31 Javascript
List Installed Hot Fixes
2007/06/12 Javascript
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
2010/09/10 Javascript
求数组最大最小值方法适用于任何数组
2013/08/16 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
JS插件overlib用法实例详解
2015/12/26 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
2017/02/14 Javascript
requirejs按需加载angularjs文件实例
2017/06/08 Javascript
Webpack执行命令参数详解
2017/06/17 Javascript
详解基于angular-cli配置代理解决跨域请求问题
2017/07/05 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
vue动态绑定class的几种常用方式小结
2019/05/21 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
2020/02/06 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
Python中的模块和包概念介绍
2015/04/13 Python
Python实现简易Web爬虫详解
2018/01/03 Python
解决新django中的path不能使用正则表达式的问题
2018/12/18 Python
python实现flappy bird游戏
2018/12/24 Python
python 2.7 检测一个网页是否能正常访问的方法
2018/12/26 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
python 画条形图(柱状图)实例
2020/04/24 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
CSS3提交意见输入框样式代码
2014/10/30 HTML / CSS
英国女性时尚品牌:Apricot
2018/12/04 全球购物
教师批评与自我批评总结
2014/10/16 职场文书
迟到检讨书
2015/01/26 职场文书
《社戏》教学反思
2016/02/22 职场文书
Nginx 常用配置
2022/05/15 Servers