MySQLdb modifizieren...

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich würde gern meine angefangene SQL-Geschichte http://www.python-forum.de/viewtopic.php?t=3175 richtig erweitern.

Ich möchte gern eine Klasse erstellen, die von MySQLdb erbt. Diese möchte ich dann mit einer Allgemeinen SELECT, INSERT, UPDATE u.a. erweitern...

Eine INSERT und UPDATE Methode könnte ungefähr so aussehen:

Code: Alles auswählen

    def insert( self, table, data ):
        """
        Vereinfachter Insert, per dict
        data ist ein Dict, wobei die SQL-Felder den Key-Namen im Dict entsprechen muß!
        """
        items   = data.keys()
        values  = data.values()

        SQLcommand = "INSERT INTO `%(dbTablePrefix)s%(table)s` ( %(items)s ) VALUES ( %(values)s );" % {
                "dbTablePrefix" : dbconf["dbTablePrefix"],
                "table"         : table,
                "items"         : ",".join( items ),
                "values"        : ",".join( ["%s"]*len(values) ) # Platzhalter für SQLdb-escape
            }
        if len( values ) == 1:
            self.cursor.execute( SQLcommand, (values[0],) )
        else:
            self.cursor.execute( SQLcommand, tuple( values ) )

    def update( self, table, data, where, limit=None ):
        """
        Vereinfachte SQL-update Funktion
        """
        items   = data.keys()
        values  = data.values()

        if not limit == None:
            limit = "LIMIT %s" % limit
        else:
            limit = ""

        SQLcommand = "UPDATE %(table)s SET %(set)s WHERE %(where)s %(limit)s;" % {
                "table"     : dbconf["dbTablePrefix"] + table,
                "set"       : ",".join( [str(i)+"=%s" for i in items] ),
                "where"     : "%s='%s'" % (where[0],where[1]),
                "limit"     : limit
            }
        if len( values ) == 1:
            self.cursor.execute( SQLcommand, (values[0],) )
        else:
            self.cursor.execute( SQLcommand, tuple( values ) )

Nur ich bekomme es mit dem Erben nicht wirklich hin...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Von einem Modul kann man ja auch nicht erben.

Musst Du denn unbedingt erben? Kannst Du nicht einfach eine Klasse schreiben, die ein Connection-Objekt im Konstruktor entgegennimmt und mit dem dann arbeiten?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Naja, ich dachte mir nur, dann hat meine Klasse direkt die ganzen Methoden und Eigenschaften des Originals...
Ich hab dazu was gefunden: http://mail.python.org/pipermail/db-sig ... 03742.html

Somit soll es so gehen:

Code: Alles auswählen

import MySQLdb.connections

class db( MySQLdb.connections.Connection ):

    def __init__ ( self, *args, **kwargs ):
        MySQLdb.connections.Connection ( self, *args, **kwargs )
Tut's aber nicht:
Traceback (most recent call last):
File "mySQL.py", line 284, in ?
db = db( "192.168.6.1", "user", "pas", "dbname")
File "mySQL.py", line 125, in __init__
MySQLdb.connections.Connection ( self, *args, **kwargs )
File "D:\Python\Python24\Lib\site-packages\MySQLdb\connections.py", line 134, in __init__
super(Connection, self).__init__(*args, **kwargs2)
TypeError: connect() argument 1 must be string, not db

Naja, die einfachere Variante ist die:

Code: Alles auswählen

class MyDB:
	def __init__ ( self, *args, **kwargs ):
		self.db = MySQLdb.connect ( *args, **kwargs )

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

jens hat geschrieben:

Code: Alles auswählen

import MySQLdb.connections

class db( MySQLdb.connections.Connection ):

    def __init__ ( self, *args, **kwargs ):
        MySQLdb.connections.Connection ( self, *args, **kwargs )
Du erzeugst in `__init__` ein `Connection` Objekt und gibst dem als ersten Parameter `self`, also das `db` Objekt! Genau das wird Dir im Traceback auch gesagt. Du musst die `__init__` von der `Connection`-Klasse aufrufen und nicht den Konstruktor.
Antworten