利用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设计模式之策略模式
Nov 18 Python
Python字符串处理实例详解
May 18 Python
解决django中ModelForm多表单组合的问题
Jul 18 Python
postman传递当前时间戳实例详解
Sep 14 Python
解决python彩色螺旋线绘制引发的问题
Nov 23 Python
Django之form组件自动校验数据实现
Jan 14 Python
wxpython自定义下拉列表框过程图解
Feb 14 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
Mar 25 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
May 19 Python
Python 制作查询商品历史价格的小工具
Oct 20 Python
python中实现词云图的示例
Dec 19 Python
Python制作春联的示例代码
Jan 22 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中使用TCPDF生成PDF文档实例
2014/07/01 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
php获取发送给用户的header信息的方法
2015/03/16 PHP
PHP实现的支付宝支付功能示例
2019/03/26 PHP
JavaScript DOM 学习第七章 表单的扩展
2010/02/19 Javascript
javascript学习笔记(七)利用javascript来创建和存储cookie
2011/04/08 Javascript
js AppendChild与insertBefore用法详细对比
2013/12/16 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
jQuery图片特效插件Revealing实现拉伸放大
2015/04/22 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
2016/02/06 Javascript
微信小程序 出现47001 data format error原因解决办法
2017/03/10 Javascript
详解Vuex中mapState的具体用法
2017/09/28 Javascript
RequireJS用法简单示例
2018/08/20 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
2020/10/30 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
[06:13]DOTA2进化论(修改版)
2013/10/08 DOTA
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
python字符串string的内置方法实例详解
2018/05/14 Python
python使用udp实现聊天器功能
2018/12/10 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
python-Web-flask-视图内容和模板知识点西宁街
2019/08/23 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
Python+unittest+requests+excel实现接口自动化测试框架
2020/12/23 Python
解决pytorch 保存模型遇到的问题
2021/03/03 Python
波兰化妆品和护肤品购物网站:eKobieca
2019/08/30 全球购物
c/c++某大公司的两道笔试题
2014/02/02 面试题
护士个人自我鉴定
2014/03/24 职场文书
小班评语大全
2014/05/04 职场文书
课外活动总结范文
2014/07/09 职场文书
美术学专业求职信
2014/07/23 职场文书
导游词300字
2015/02/13 职场文书
详解MySQL的内连接和外连接
2023/05/08 MySQL