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
120.22012-08-31 19:47Frédéric Lang Delete
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).
100.12012-06-30 21:38Frédéric Lang Delete

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.

FEDER Powered By FusionForge Collaborative Development Environment Charte d'utilisation / Nous contacter / Mentions légales Haut de page