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

    技术2022-07-10  178

    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')
    Processed: 0.017, SQL: 9