用Python读取pg数据库,准确统计每一张表的数据量,输出中英文表名和数据量

11 篇文章 0 订阅
5 篇文章 0 订阅

1 前言

在我们工作中,有时候老板关系我们手上到底有多少数据,每一张表中到底有多少数据量,整个库又有多少数据量?要给他一个准确的数据,给出一张详细清单。
在网上遇到的一种做法是使用navicat写SQL语句统计pg_class里面的reltuples这个列数据,但是发现这个数据有很大偏差。

2 正文

给出的办法有两种:
1、写一个SQL语句计算每一张表:select count(1) from table_a union all;select count(1) from table_b union all …;
2、第三方工具来解决——Python

在第一种方法中,我们要知道每一张表的名字,而且写这个SQL语句会很长,当出现错误时很难修改,为此,我选择通过编写Python来统计,还可以把计算结果输出到Excel中。

import psycopg2
import pandas as pd

conn=psycopg2.connect(database='db_name',user='postgres',password='my_password',host='10.100.100.1',port='5432')
cursor=conn.cursor()
# cursor.execute("SELECT a.relname,a.reltuples,cast(obj_description(relfilenode,'pg_class') as varchar) 名称  FROM pg_class a LEFT OUTER JOIN pg_description b ON b.objsubid=0 AND a.oid = b.objoid  WHERE a.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public')  AND a.relkind='r' ORDER BY a.relname;")
cursor.execute("SELECT a.relname AS name,b.description AS comment  FROM pg_class a LEFT OUTER JOIN pg_description b ON b.objsubid=0 AND a.oid = b.objoid WHERE a.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public') AND a.relkind='r' ORDER BY a.relname;")
               
rows =pd.DataFrame(cursor.fetchall(),columns=['English','Chinese'])
table_list=[]
for i in range(len(rows)):
    cursor.execute("select count(*) from %s"%rows.English[i])
    num=cursor.fetchall()[0][0]
    table_list.append([rows.English[i],rows.Chinese[i],num])
conn.commit()
table_list=pd.DataFrame(table_list,columns=['English','Chinese','Count'])
print(table_list)
#table_list.to_excel('C://destop/table_list.xls')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值