AllgemeinBlogLinuxPython

Python Datenbank Klasse Update

In meiner Datenbank Klasse habe ich lange Zeit die Update Funktion missen lassen. Hier gelangt ihr zum alten Artikel. Einfach aus dem Grund weil ich sie vorher noch nicht benötigt habe. Das habe ich hiermit nun nachgezogen(Eigentlich existiert sie schon wesentlich länger, aber ich habe jetzt erst den Artikel verfasst 😉 ). Das Update kann separat aufgerufen werden, macht aber auch Sinn in Zusammenhang mit einem Insert. Falls dort z.B. ein Primärschlüssel schon existiert, kann dieser geupdated werden.

Für ein internes Projekt habe ich folgende Befehlszeilen dafür benutzt

if not DB.QueryInsert("insert into AUX_PROJECTS(%s) VALUES(%s)",{"ID":PList[i][0],PList[0][1]:PList[i][1],"ZINS":str(PList[i][2]).replace(",","."),PList[0][3]:PList[i][3],"ANLAGE":PList[i][4],"STATUS":PList[i][5],"SCORE":PList[i][6],PList[0][7]:PList[i][7],PList[0][8]:PList[i][8],"UNIT":PList[i][9],"UPLOADED_AT":PList[i][10]}, True):
                DB.QueryUpdate("update AUX_PROJECTS SET %s where %s",{PList[0][1]:PList[i][1],"ZINS":str(PList[i][2]).replace(",","."),"ANLAGE":PList[i][4]},"ID", PList[i][0])

Das Insert erwahrtet wie gewohnt die insert Query gefolgt von einem Tupel mit den Namen und den Werten. Als 3.ten Parameter kann noch das Update auf True oder False gesetzt werden, dies triggert allerdings zurzeit nur eine Ausgabe. Wenn dieses Insert nicht funktioniert, bzw. ein False zurückgibt, versucht er ein Update. Der Aufbau ist ähnlich wie beim Insert. Zuerst die Update Query, gefolgt von dem Tupel.

Eine Update könnte dann wie folgt in der Shell angezeigt werden:

Hier der komplette neue Code.

import mysql.connector
from mysql.connector import errorcode
from termcolor import colored

class databaseconnection:
    host=username=password=database=cnx=cursor=None

    def __init__(self,host,username,password,database):
        self.host = host
        self.username = username
        self.password = password
        self.database = database

    def Connect(self):
        config = {
            'user': self.username,
            'password': self.password,
            'host': self.host,
            'database': self.database
            }
        try:
            self.cnx = mysql.connector.connect(**config)
            self.cursor = self.cnx.cursor()
            print(colored("[I] + DB Connection established","green"))
        except mysql.connector.Error as err:
            if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
                print(colored("[C] + Wrong Username/Password","red"))
            elif err.errno == errorcode.ER_BAD_DB_ERROR:
                print(colored("[C] + Database Error","red"))
            else:
                print(colored("[C] + " + err,"red"))

    def QuerySelect(self,sqlstatement, params, header):
        if (params is not None):
            try:
                self.cursor.execute(sqlstatement, (params,))
                rtnvalue = self.cursor.fetchall()
                print(colored("[I] + executed select with params","green"))
                if header:
                    rtnvalue.insert(0,self.cursor.column_names)
                return rtnvalue
            except:
                print(colored("[C] + something went wrong while executing select with params:","red"))
                return False
        else:
            try:
                self.cursor.execute(sqlstatement)
                rtnvalue = self.cursor.fetchall()
                print(colored("[I] + executed select without params: " + sqlstatement,"green"))
                if header:
                    rtnvalue.insert(0,self.cursor.column_names)
                return rtnvalue
            except:
                print(colored("[C] + something went wrong while executing select without params","red"))
                return None

    def QueryInsert(self, sqlstatement, params, update):
        if (params is not None):
            columns = ', '.join(params.keys())
            values = params.values()
            sql = sqlstatement % (columns, ', '.join(repr(e) for e in values))
            print(colored("[I] + " + sql,"yellow"))
            try:
                self.cursor.execute(sql)
            except mysql.connector.Error as er:
                if er.errno == errorcode.ER_DUP_ENTRY:
                    if(update == True):
                        print(colored("[W] + transaction rolled back: Duplication found - Try update " ,"yellow"))
                    else:
                        print(colored("[W] + transaction rolled back: Duplication found " ,"yellow"))
                    ###########try to make an update##########
                    return False
                else:
                    print(colored("[C] + a criticial error occured " + er.msg,"red"))
                    return False
        else:
            print(colored("[C] + insert execution failed due missing parameters","red"))
            return False

        try:
            self.cnx.commit()
            print(colored("[I] + transaction committed, value added","green"))
            return True
        except mysql.connector.Error as er:
            self.cnx.rollback()
            print(colored("[C] + transaction rolled back: " + er.msg,"red"))
            return False

    # performs an DB update
    # @var sqlstatement (update AUX_PROJECTS SET %s where %s)
    # @var params Data to being updated
    # @var Conditionheader Primary key
    # @var ConditionValue PK agains value
    def QueryUpdate(self, sqlstatement, params, Conditionheader,ConditionValue):
        if (params is not None):
            updatestring = self.CreateUpdateString(params)
            sql = sqlstatement % (updatestring,Conditionheader + " = " + ConditionValue)
            print(colored("[I] + " + sql,"yellow"))
            try:
                self.cursor.execute(sql)
            except mysql.connector.Error as er:
                self.cnx.rollback()
                print(colored("[C] + transaction rolled back: " + er.msg,"red"))
                return False
        else:
            print(colored("[C] + update execution failed due missing parameters","red"))
            return False

        try:
            self.cnx.commit()
            print(colored("[I] + transaction committed, value updated","green"))
            return True
        except mysql.connector.Error as er:
            self.cnx.rollback()
            print(colored("[C] + transaction rolled back: " + er.msg,"red"))
            return False

    def CreateUpdateString(self,params):
        updatestring = ''
        for key,value in params.items():
                updatestring = updatestring + key + '=' + repr(str(value))
                if(key == list(params.keys())[-1]):
                        continue

                updatestring = updatestring + ','

        return str(updatestring)

    def Disconnect(self):
        self.cnx.close()
        print(colored("[I] + Connection closed","green"))

 

 

 

 

 

 

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.