利用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中的应用之translate和maketrans用法详解
Aug 27 Python
Linux 发邮件磁盘空间监控(python)
Apr 23 Python
浅析Python中元祖、列表和字典的区别
Aug 17 Python
Python使用pymysql小技巧
Jun 04 Python
python 读写中文json的实例详解
Oct 29 Python
Linux系统(CentOS)下python2.7.10安装
Sep 26 Python
Python实现将通信达.day文件读取为DataFrame
Dec 22 Python
python实现批量视频分帧、保存视频帧
May 31 Python
解决paramiko执行命令超时的问题
Apr 16 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
Apr 22 Python
基于python和flask实现http接口过程解析
Jun 15 Python
python归并排序算法过程实例讲解
Nov 04 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实现邮件群发的源码
2013/06/18 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
PHP PDOStatement::execute讲解
2019/01/31 PHP
jQuery 删除或是清空某个HTML元素示例
2014/08/04 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
基于jQuery实现返回顶部实例代码
2016/01/01 Javascript
JS实现点击事件统计的简单实例
2016/07/10 Javascript
JSON对象 详解及实例代码
2016/10/18 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
AngularJS表单验证功能
2017/10/19 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
jQuery解析json格式数据示例
2018/09/01 jQuery
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
JavaScript闭包相关知识解析
2019/10/19 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
2020/04/29 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
python创建进程fork用法
2015/06/04 Python
详解Python中的Descriptor描述符类
2016/06/14 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
Python闭包之返回函数的函数用法示例
2018/01/27 Python
如何将你的应用迁移到Python3的三个步骤
2019/12/22 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
python 代码运行时间获取方式详解
2020/09/18 Python
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
Made in Design德国:设计师家具、灯具和装饰
2019/10/31 全球购物
《理想》教学反思
2014/02/17 职场文书
五一劳动节演讲稿
2014/09/12 职场文书
千与千寻观后感
2015/06/04 职场文书
工作年限证明模板
2015/06/15 职场文书
导游词之潮音寺
2019/09/26 职场文书