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')