利用python為PostgreSQL的表自動(dòng)添加分區(qū)
PostgreSQL引進(jìn)“分區(qū)”表特性,解放了之前采用“表繼承”+“觸發(fā)器”來(lái)實(shí)現(xiàn)分區(qū)表的繁瑣、低效。而添加分區(qū),都是手動(dòng)執(zhí)行SQL。
演示目的:利用python來(lái)為PostgreSQL的表自動(dòng)添加分區(qū)。
python版本:python3+
pip3 install psycopg2
一、配置數(shù)據(jù)源
database.ini 文件:記錄數(shù)據(jù)庫(kù)連接參數(shù)
[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() 函數(shù)讀取 database.ini 文件并返回連接參數(shù)。config() 函數(shù)位于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
三、創(chuàng)建子表腳本
pg_add_partition_table.py 文件:其中 create_table函數(shù)是創(chuàng)建子表SQL。其中參數(shù)
參數(shù)名 | 含義 |
---|---|
db | 指向數(shù)據(jù)庫(kù) |
table | 主表 |
sub_table | 正要新建的子表名 |
start_date | 范圍分界開(kāi)始值 |
end_date | 范圍分界結(jié)束值 |
#!/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()
四、執(zhí)行文件main.py
main.py:主文件;通過(guò)執(zhí)行main生成分區(qū)表。
示例:
#!/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');
上面示例單獨(dú)為表tbl_game_android_step_log;創(chuàng)建分區(qū);若多個(gè)表;用for語(yǔ)句處理
# 多表操作 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')
到此這篇關(guān)于利用python為PostgreSQL的表自動(dòng)添加分區(qū)的文章就介紹到這了,更多相關(guān)python PostgreSQL添加分區(qū)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3+RIDE+RobotFramework自動(dòng)化測(cè)試框架搭建過(guò)程詳解
這篇文章主要介紹了Python3+RIDE+RobotFramework自動(dòng)化測(cè)試框架搭建過(guò)程詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09Python連接SQLite數(shù)據(jù)庫(kù)并進(jìn)行增冊(cè)改查操作方法詳解
這篇文章主要介紹了Python對(duì)SQLite數(shù)據(jù)庫(kù)進(jìn)行增冊(cè)改查操作方法詳解,需要的朋友可以參考下2020-02-02Tensorflow限制CPU個(gè)數(shù)實(shí)例
今天小編就為大家分享一篇Tensorflow限制CPU個(gè)數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02TensorFlow和Numpy矩陣操作中axis理解及axis=-1的解釋
在調(diào)用numpy庫(kù)中的concatenate()時(shí),有遇到axis=-1/1/0的情況,下面這篇文章主要給大家介紹了關(guān)于TensorFlow和Numpy矩陣操作中axis理解及axis=-1解釋的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03Python pandas如何根據(jù)指定條件篩選數(shù)據(jù)
這篇文章主要介紹了Python pandas如何根據(jù)指定條件篩選數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02人工智能最火編程語(yǔ)言 Python大戰(zhàn)Java!
開(kāi)發(fā)者到底應(yīng)該學(xué)習(xí)哪種編程語(yǔ)言才能獲得機(jī)器學(xué)習(xí)或數(shù)據(jù)科學(xué)這類工作呢?這是一個(gè)非常重要的問(wèn)題。本文為大家提供作者的答案并解釋原因2017-11-11Python正則表達(dá)式字符串的匹配、替換、分割、查找方式
這篇文章主要介紹了Python正則表達(dá)式字符串的匹配、替換、分割、查找方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07