Browse | Submit A New Snippet | Create A Package
Compteur occurences bdd Postgres | |
Type: Full Script |
Category: Database Manipulation |
License: GNU General Public License |
Language: Python |
Description: Petit script Python 2.6 affichant l'ensemble des schémas et tables d'une bdd Postgres avec, pour chaque ensemble - le nombre de lignes - l'espace utilisé sur disque + les mêmes infos pour la bdd en elle-même. Nécessite le module psycopg2 (non inclus dans Python) pour pouvoir se connecter à une bdd Postgres. Nécessite aussi, si on veut pouvoir l'exécuter sans avoir à lui fournir les paramètres de connexion, que ceux-si soient écrits dans un fichier fichier "config.ini" dont voici un exemple # # Fichier de configuration pour les outils de manipulation bdd # Ce fichier n'est pas utilisé par l'application # Ce fichier est uniquement à usage des programmeurs # Auteur : IEF Frédéric Lang (fr.lang@free.fr) # # Configuration pour la connexion bdd [bdd/connexion] host = /tmp # Serveur (chemin=socket) port = 5432 # Port dbname = bdd_test # Nom bdd user = postgres # Utilisateur bdd |
Versions Of This Snippet:
Snippet ID | Download Version | Date Posted | Author | Delete |
---|---|---|---|---|
12 | 0.2 | 2012-08-31 19:47 | Frédéric Lang | ![]() |
Changes since last version: Petit changement dans la façon dont le script saute les tables temporaires de la bdd (tables dont la durée de vie est celle d'une session d'un utilisateur). Dans la version précédente le script cherchait des tables dont le nom ne commence pas par "pg_temp" (caractéristique d'une table temporaire). Maintenant il cherche les tables dont le commit_action est null. J'en ai profité pour rajouter l'affichage des séquences de la bdd Postgres, avec pour chacune d'elle sa valeur déjà atteinte et le taux de remplissage de la séquence (par rapport à sa valeur maximale possible). | ||||
10 | 0.1 | 2012-06-30 21:38 | Frédéric Lang | ![]() |
Download a raw-text version of this code by clicking on “Download Version”
Latest Snippet Version: 0.2
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Compteur des valeurs d'une bdd Postgres
# Auteur: Frédéric Lang (fr.lang@free.fr)
#
# Usage: prog [-h host] [-p port] [-U user] [-P password] [-?]
# Option -h, --host=host: Connexion sur le serveur host
# Option -p, --port=port: Connexion sur le port port
# Option -U, --user=user: Connexion avec l'utilisateur user
# Option -P, --password=password: Connexion avec le mot de passe
# Option -?, --help: Utilisation de ce programme
# Modules Python
import psycopg2 # Accès PostgreSQL
import sys # Paramètres et fonctions systèmes
import os # Gestion os
import getopt # Gestion des options Posix
import ConfigParser # Analyse fichier configuration
# 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(
bddId): # Identifiant base de données
# Curseur de travail
curs=bddId.cursor()
# Nb de schémas et de tables
curs.execute(
"select count (distinct schemaname), count(relname)"\
+ " from pg_stat_user_tables"\
+ " where (schemaname, relname) in ("
+ " select table_schema, table_name"
+ " from information_schema.tables"
+ " where commit_action is null"
+ ")"
)
(nb_schema, nb_table)=curs.fetchone()
# Nb de séquences
curs.execute(
"select count (sequence_schema||sequence_name)"\
+ " from information_schema.sequences"\
)
nb_sequence=curs.fetchone()[0]
# Recherche liste des tables
curs.execute(
"select schemaname, relname, pg_size_pretty("\
+ "pg_total_relation_size(relid)"\
+ ")"\
+ " from pg_stat_user_tables"\
+ " where (schemaname, relname) in ("
+ " select table_schema, table_name"
+ " from information_schema.tables"
+ " where commit_action is null"
+ ")"
+ " 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
# Recherche liste des séquences
curs.execute(
"select sequence_schema, sequence_name"\
+ " from information_schema.sequences"\
+ " order by sequence_schema, sequence_name"
)
# Affichage des informations pour chaque séquence
for (schema, sequence) in curs.fetchall():
curs.execute("select last_value, max_value from \"%s\".\"%s\"" % (schema, sequence))
(last_value, max_value)=curs.fetchone()
yield "sequence [%s%s]: last value %d [%d %%]" % (
"%s." % schema if schema != "public" else "",
sequence,
last_value,
last_value * 100 / max_value,
)
# for
# Informations générales bdd
curs.execute(
"select current_database(), pg_size_pretty(pg_database_size(current_database()))"
)
res=curs.fetchone()
yield "%s [%s, %s, %s]: %d rows [%s]" % (
res[0],
"%d schéma%s" % (
nb_schema,
"s" if nb_schema > 1 else "",
),
"%d table%s" % (
nb_table,
"s" if nb_table > 1 else "",
),
"%d séquence%s" % (
nb_sequence,
"s" if nb_sequence > 1 else "",
),
tot,
res[1],
)
# 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
Add a new version
You can submit a new version of this snippet if you have modified it and you feel it is appropriate to share with others.