利用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分析git log日志示例
Feb 27 Python
python实现忽略大小写对字符串列表排序的方法
Sep 25 Python
Python中几个比较常见的名词解释
Jul 04 Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
Aug 07 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
Nov 16 Python
Python3中条件控制、循环与函数的简易教程
Nov 21 Python
Django实战之用户认证(用户登录与注销)
Jul 16 Python
使用Python如何测试InnoDB与MyISAM的读写性能
Sep 18 Python
Django实现网页分页功能
Oct 31 Python
python基于socket实现的UDP及TCP通讯功能示例
Nov 01 Python
Django 实现对已存在的model进行更改
Mar 28 Python
python将logging模块封装成单独模块并实现动态切换Level方式
May 12 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/09 PHP
探讨:如何编写PHP扩展
2013/06/13 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
php获取linux命令结果的实例
2017/03/13 PHP
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
AngularJS入门教程之ng-class 指令用法
2016/08/01 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
浅谈js函数的多种定义方法与区别
2016/11/29 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
python实现的登录和操作开心网脚本分享
2014/07/09 Python
Python使用django获取用户IP地址的方法
2015/05/11 Python
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
Python wxPython库消息对话框MessageDialog用法示例
2018/09/03 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
在Pytorch中计算自己模型的FLOPs方式
2019/12/30 Python
python+selenium+chromedriver实现爬虫示例代码
2020/04/10 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
python实现图片转字符画
2021/02/19 Python
解决PDF 转图片时丢文字的一种可能方式
2021/03/04 Python
使用Python webdriver图书馆抢座自动预约的正确方法
2021/03/04 Python
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
俄罗斯汽车零件和配件在线商店:CarvilleShop
2019/11/29 全球购物
幼儿园开学家长寄语
2014/01/19 职场文书
优秀交警事迹材料
2014/01/26 职场文书
医学类个人求职信范文
2014/02/05 职场文书
我们的节日清明节活动方案
2014/03/05 职场文书
《长相思》听课反思
2014/04/10 职场文书
一分钟演讲稿
2014/04/30 职场文书
委托培训协议书
2014/11/17 职场文书
2014年帮扶工作总结
2014/11/26 职场文书
表扬稿范文
2015/01/17 职场文书
python中tkinter复选框使用操作
2021/11/11 Python