gpt4 book ai didi

如何为PostgreSQL的表自动添加分区

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章如何为PostgreSQL的表自动添加分区由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

PostgreSQL 引进“分区”表特性,解放了之前采用“表继承”+ “触发器”来实现分区表的繁琐、低效。而添加分区,都是手动执行 SQL.

演示目的:利用 python 来为 PostgreSQL 的表自动添加分区.

python版本: python3+ 。

?
1
pip3 install psycopg2

  。

1、配置数据源 。

database.ini 文件:记录数据库连接参数 。

?
1
2
3
4
5
6
7
8
9
10
11
12
[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

  。

2、config 脚本 。

config.py 文件:下面的config() 函数读取database.ini文件并返回连接参数。config() 函数位于config.py文件中 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/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

  。

3、创建子表脚本 。

pg_add_partition_table.py 文件:其中 create_table函数是创建子表SQL。其中参数 。

  。

  。

参数名 含义
db 指向数据库
table 主表
sub_table 正要新建的子表名
start_date 范围分界开始值
end_date 范围分界结束值

  。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/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()

  。

4、执行文件main.py 。

main.py:主文件;通过执行main生成分区表.

示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/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语句处理 。

?
1
2
3
# 多表操作
  for table in [ 'tbl_game_android_step_log' , 'tbl_game_android_game_log' , 'tbl_game_android_pay_log' ]:
    create_sub_table( 'test' , table);

] 。

演示之前:

?
1
2
3
4
5
6
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)

演示之后:

?
1
2
3
4
5
6
7
8
9
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' )

5、加入定时任务 。

到此这篇关于如何为PostgreSQL的表自动添加分区的文章就介绍到这了,更多相关PostgreSQL的表添加分区内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://www.cnblogs.com/lottu/archive/2021/01/04/14228477.html 。

最后此篇关于如何为PostgreSQL的表自动添加分区的文章就讲到这里了,如果你想了解更多关于如何为PostgreSQL的表自动添加分区的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com