利用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脚本设置系统时间的两种方法
Feb 21 Python
浅析Python 中整型对象存储的位置
May 16 Python
深入解析Python编程中super关键字的用法
Jun 24 Python
python数据结构之列表和元组的详解
Sep 23 Python
Python实现的摇骰子猜大小功能小游戏示例
Dec 18 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
Jul 23 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
Feb 22 Python
基于python和flask实现http接口过程解析
Jun 15 Python
python判断all函数输出结果是否为true的方法
Dec 03 Python
Django后端按照日期查询的方法教程
Feb 28 Python
Python Flask实现进度条
May 11 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
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
PHP一个简单的无需刷新爬虫
2019/01/05 PHP
css图片自适应大小
2007/11/28 Javascript
Javascript匿名函数的一种应用 代码封装
2010/06/27 Javascript
JS检测输入字符是否包含非法字符的示例代码
2014/02/11 Javascript
充分发挥Node.js程序性能的一些方法介绍
2015/06/23 Javascript
11种ASP连接数据库的方法
2015/09/18 Javascript
javascript每日必学之多态
2016/02/23 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
jQuery ajax动态生成table功能示例
2017/06/14 jQuery
Angular弹出模态框的两种方式
2017/10/19 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
vue二级菜单导航点击选中事件的方法
2018/09/12 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
Python计算三角函数之asin()方法的使用
2015/05/15 Python
Python对数据库操作
2016/03/28 Python
浅谈python中的面向对象和类的基本语法
2016/06/13 Python
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
在python中实现对list求和及求积
2018/11/14 Python
详解Python3 基本数据类型
2019/04/19 Python
Python编译成.so文件进行加密后调用的实现
2019/12/23 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
Python根据字符串调用函数过程解析
2020/11/05 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
简历中个人求职的自我评价模板
2013/11/29 职场文书
运动会方队口号
2014/06/07 职场文书
高中学校对照检查材料
2014/08/31 职场文书
先进个人总结范文
2015/02/15 职场文书
社区工作者个人总结
2015/02/28 职场文书
婚育证明格式
2015/06/17 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书