python: variation BD Oracle

Le script ci dessous produit une classe sign qui permet de calculer une clef de chaque table de’une bd Oracle.

méthode
description
sign() créer une instance de la classe
connect() se connecte au serveur de données (ms SQL server)
rowscnTable() calcul la clef de la table passée en paramètre
rowscnTables() calcule la clef de toutes les tables de la bd
save() enregistre le résultat du calcul dans un fichier

 

#-*-coding:utf-8-*-
import cx_Oracle
import Tkinter, tkFileDialog # pour save
import datetime
class sign(dict):
    def __init__(self):
        pass
    def connect(self,srv,usr,pwd,service):
        """connexion à un serveur ms sql server"""
        self.service=service
        self.usr=usr
        self.cnx= cx_Oracle.connect('%s/%s@%s/%s' % (usr,pwd,srv,service))
    def tables(self):
        """liste des tables """
        rq="SELECT * FROM user_tables"
        crs=self.cnx.cursor()
        crs.execute(rq)
        ds=crs.fetchall()
        crs.close()
        T=[]
        for dr in ds:
            T.append(dr[0])
        return T
    def sqlGetValue(self, requete):
        """retourne une valeur scalaire d'une requete sql"""
        crs=self.cnx.cursor()
        crs.execute(requete)
        dr=crs.fetchone()
        R=dr[0]
        crs.close()
        return R
   
    def rowscnTable(self,tableName):
        """ Objet calcul la clef de la table passée en param """
        rq="SELECT max(ora_rowscn) from %s" % tableName
        R= self.sqlGetValue(rq)
        if not R:
            R=0
        return R
    def rowscnTables(self):
        """calcul la clef de toutes les tables de la bd"""
        self.clear()
        for t in self.tables():
            self[t]=self.rowscnTable(t)
    def close(self):
        self.cnx.close()
    def save(self, fichier=None):
        """Sauvegarde des clefs calculées dans un fichier"""
        if not fichier:
            strdate=datetime.datetime.today().strftime('%Y-%m-%d_%Hh%M')
            model= 'keys.tables.%s.%s.%s.txt'%(self.usr,self.service,strdate)
            title='Enregistrer sous...'
            fichier=tkFileDialog.asksaveasfilename(parent= Tkinter.Tk(),title=title,initialfile=model)
        if fichier:
            f=open(fichier,'w')
            T=self.keys()
            T.sort()
            for t in T:
                f.write('%s %i\n' % (t,self[t]))
            f.close()
# -------------------- USAGE -------------------------------------------
X=sign()
X.connect(srv='',usr='',pwd='',service='')
X.rowscnTables()
X.save()
X.close()

 

Principe:   La pseudo colonne ora_rowscn d’une table de base oracle est mise à jour à chaque update, insert de la table cette valeur est donc modifiée lorsque les données de la table varient nous allons nous appuyer dessus pour générer nos clefs de comparaison. Autre point cette fonction est croissante la valeur max d’une table variera donc à chaque modification/insertion de donnée. autres infos…

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *