Seite 1 von 1

MySQLdb modifizieren...

Verfasst: Dienstag 21. Juni 2005, 19:21
von jens
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...

Verfasst: Dienstag 21. Juni 2005, 22:03
von 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?

Verfasst: Mittwoch 22. Juni 2005, 06:34
von jens
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 )

Verfasst: Mittwoch 22. Juni 2005, 22:52
von 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.