#!/usr/bin/env python # -*- coding: utf-8 -*- # Compteur des valeurs de la bdd # Auteur: Frédéric Lang (fr.lang@free.fr) # # Usage: prog [-h host] [-p port] [-U user] [-P password] [-?] # Option -h, --host=host: Connection sur le serveur host # Option -p, --port=port: Connection sur le port port # Option -U, --user=user: Connection avec l'utilisateur user # Option -P, --password=password: Connection avec le mot de passe # Option -?, --help: Utilisation de ce programme # Modules Python import psycopg2 import sys import os import getopt import ConfigParser # Fonction de connection def connect( *args, # Liste arguments **kwargs): # Association arguments # Récupération informations de connexion parser=ConfigParser.ConfigParser() parser.read("%s/config.ini" % os.path.dirname(sys.argv[0])) # Host bdd host=kwargs["host"]\ if "host" in kwargs.keys() and kwargs["host"] != None\ else parser.get("bdd/connexion", "host").split("#")[0].strip() # Port bdd port=kwargs["port"]\ if "port" in kwargs.keys() and kwargs["port"] != None\ else parser.get("bdd/connexion", "port").split("#")[0].strip() # Nom bdd dbname=kwargs["dbname"]\ if "dbname" in kwargs.keys() and kwargs["dbname"] != None\ else parser.get("bdd/connexion", "dbname").split("#")[0].strip() # User bdd user=kwargs["user"]\ if "user" in kwargs.keys() and kwargs["user"] != None\ else parser.get("bdd/connexion", "user").split("#")[0].strip() # Passwd bdd password=kwargs["password"]\ if "password" in kwargs.keys() and kwargs["password"] != None\ else "" # Connection return psycopg2.connect( "host='%s' port='%s' dbname='%s' user='%s' password='%s'" % ( host, port, dbname, user, password, ) ) # connect() # Compteur bdd def cpt( id): # Identifiant base de données # Curseur de travail curs=id.cursor() # Nb de schémas curs.execute( "select count (distinct schemaname), count(relname)"\ + " from pg_stat_user_tables"\ + " where schemaname not like 'pg_temp%'" ) (nb_schema, nb_table)=curs.fetchone() # Recherche liste des tables curs.execute( "select schemaname, relname, pg_size_pretty("\ + "pg_total_relation_size(relid)"\ + ")"\ + " from pg_stat_user_tables"\ + " where schemaname not like 'pg_temp%'"\ + " order by schemaname, relname" ) # Affichage des compteurs pour chaque table tot=0 for (schema, table, size) in curs.fetchall(): curs.execute("select count(*) from \"%s\".\"%s\"" % (schema, table)) cpt=curs.fetchone()[0] tot+=cpt yield "table [%s%s]: %d rows [%s]" % ( "%s." % schema if schema != "public" else "", table, cpt, size, ) # for curs.execute( "select pg_size_pretty(pg_database_size(current_database()))" ) yield "total [%s, %s]: %d rows [%s]" % ( "%d schéma%s" % ( nb_schema, "s" if nb_schema > 1 else "", ), "%d table%s" % ( nb_table, "s" if nb_table > 1 else "", ), tot, curs.fetchone()[0], ) # Fermeture curseur curs.close() # cpt() if __name__ == "__main__": # Fonction "usage" def usage(): print "%s" % (os.path.basename(sys.argv[0])) print "Usage: %s [-h, --host=host] [-p, --port=port] [-U, --user=user] [-P, --password=password] [-?, --help]" % os.path.basename(sys.argv[0]) print "\tOption -h, --host=host: Connection sur le serveur host" print "\tOption -p, --port=port: Connection sur le port port" print "\tOption -U, --user=user: Connection avec l'utilisateur user" print "\tOption -P, --password=password: Connection avec le mot de passe" print "\tOption -?, --help: Utilisation de ce programme" # usage() # Gestion des options optItem={ "host" : None, "port" : None, "user" : None, "password" : None, } try: (optList, args)=getopt.getopt( sys.argv[1:], "h:p:U:P:?", [ "host=", "port=", "user=", "password=", "help", ], ) except getopt.GetoptError, eClass: print eClass usage() sys.exit(1) # try for (opt, val) in optList: if opt in ("-h", "--host"): optItem["host"]=val elif opt in ("-p", "--port"): optItem["port"]=val elif opt in ("-U", "--user"): optItem["user"]=val elif opt in ("-P", "--password"): optItem["password"]=val elif opt in ("-?", "--help"): usage() sys.exit(0) # for # Suppression des options de la liste des arguments sys.argv=[sys.argv[0],] + args # Traitement des arguments éventuels for bdd in sys.argv[1:] if len(sys.argv) > 1 else (None,): # Connection bdd bddId=connect( host=optItem["host"], port=optItem["port"], user=optItem["user"], password=optItem["password"], dbname=bdd, ) print "bddId [%s]" % bddId # Compteur for info in cpt(bddId): print info print # Fermeture bdd bddId.close() # for # if