Adressdatenbank

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

CrackPod hat geschrieben:Und wie sieht das mit set() aus? was macht das? Ich komm mit englischen Dokumentationen von Programmiersprachen überhaupt nich klar - zu kompliziert :oops:
Hab ich doch geschrieben - lies doch mal mein letztes Posting.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Leonidas hat geschrieben:
CrackPod hat geschrieben:Und wie sieht das mit set() aus? was macht das? Ich komm mit englischen Dokumentationen von Programmiersprachen überhaupt nich klar - zu kompliziert :oops:
Hab ich doch geschrieben - lies doch mal mein letztes Posting.
:oops: Tut mir leid, den hab ich übersehen.

Danke,
Greetz
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Ich habe jetzt mal deinen Code hergenommen (und soweit eigentlich auch verstanden). Nur, was ich noch nich versteh is, wie ich in der Liste der Datenbankspalten suchen kann. Das mit der Forschleifen geht nicht:

Code: Alles auswählen

#------------------------------------------------------------
    def match(self, row):
        return dict((name, row[name]) for name in (self.dbCols))

#------------------------------------------------------------
    def get(self, args, getall = False):
        '''Suche nach Kontakten

        :param args: Dictionary für die Suche. Keys sind die Spalten, in denen gesucht wird; Values die Werte für die Spalten.
        '''

        #Erstellt den SQL-Befehl und erstellt die WHERE-Klausel wobei - falls mehrere Argumente angegeben worden sind - diese mit einem AND verknüpft werden
        sql = '''SELECT %s FROM addresses''' % ', '.join(self.dbCols)

        self.cur.execute(sql)

        adresses = map(self.match, self.cur)

        return adresses

Code: Alles auswählen

    foo = adr.get({'vorname':'Max','nachname':'Musterman'})
    for col in foo:
        for key, val in col.items():
            print key,'==>',val
---------------
Datensatz nummer: 1
mobilnummer ==> 01701234586
land ==> Deutschland
zuname ==> Maximilian
ort ==> Musterstadt
anrede ==> Herr
adresse ==> Musterstr 12
plz ==> 1234865
bueronummer ==>
id ==> 1
email ==> max.musterman@muster.de
privatfaxnummer ==>
nachname ==> Musterman
buerofaxnummer ==>
privatnummer ==> 004912326548
vorname ==> Max
---------------
Datensatz nummer: 2
mobilnummer ==> 01701234586
land ==> Deutschland
zuname ==> Maximilian
ort ==> Musterstadt
anrede ==> Herr
adresse ==> Musterstr 12
plz ==> 1234865
bueronummer ==>
id ==> 2
email ==> max.musterman@muster.de
privatfaxnummer ==>
nachname ==> Musterman
buerofaxnummer ==>
privatnummer ==> 004912326548
vorname ==> Max II.
---------------
Datensatz nummer: 3
mobilnummer ==> 01701234586
land ==> Kino
zuname ==> Umzumzumz
ort ==> Polar
anrede ==> aus der
adresse ==> Eisstr 12
plz ==> 1234865
bueronummer ==>
id ==> 3
email ==> murmel.aus_dem-eis@kalterPolar.de
privatfaxnummer ==>
nachname ==> Murmel
buerofaxnummer ==>
privatnummer ==> 004912326548
vorname ==> schubdidub
Fazit: Nunja, die Suche geht nicht :wink: Oder hab ich beim übernehmen nur einen Fehler gemacht? Allerdings kann ich mir nicht so ganz vorstellen, dass man einfach so eine Liste übergeben kann, in der dann gesucht wird, ich mein, die Liste der Spalten hat ja keinen Suchwert?!(wenn ihr jetzt versteht, was ich mein)
Greetz
BlackJack

Ich verstehe die Frage nicht ganz. Du suchst ja auch nirgends, jedenfalls nicht in den Quelltextschnipseln, die Du eben angegeben hast.

Da steht zwar ein Kommentar bei der SQL Zeichenkette über eine ``WHERE`` Klausel, aber die steht da nirgends!?
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Also ich hab das ganze jetz nochma genau angeschaut und wieder ein wenig mehr verstanden :wink:
So sieht der ganze Spaß bis jetz aus:

Code: Alles auswählen

#------------------------------------------------------------
    def match(self, row):

        data = dict((name, row[name]) for name in (self.dbCols))
        if 'Max' in data.values():
            return data

#------------------------------------------------------------
    def get(self, args, getall = False):
        '''Suche nach Kontakten

        :param args: Dictionary für die Suche. Keys sind die Spalten, in denen gesucht wird; Values die Werte für die Spalten.
        '''

        #Erstellt den SQL-Befehl und erstellt die WHERE-Klausel wobei - falls mehrere Argumente angegeben worden sind - diese mit einem AND verknüpft werden
        sql = '''SELECT %s FROM addresses''' % ', '.join(self.dbCols)

        self.cur.execute(sql)

        adresses = map(self.match, self.cur)

        self.out(adresses)
Aufruf:

Code: Alles auswählen

    adr.add('Max','Maximilian','Musterman','Herr','Musterstr 12',
'1234865','Musterstadt','Deutschland','004912326548','',
'01701234586','','','max.musterman@muster.de')
    adr.add('Max II.','Maximilian','Musterman','Herr','Musterstr 12',
'1234865','Musterstadt','Deutschland','004912326548','',
'01701234586','','','max.musterman@muster.de')
    adr.add('schubdidub','Umzumzumz','Murmel','aus der','Eisstr 12',
'1234865','Polar','Kino','004912326548','','01701234586','','',
'murmel.aus_dem-eis@kalterPolar.de')
    adr.get({'nachname':'Musterman',})
Funktioniert auch eigentlich Super... Nur: Wenn ich map benutze: Wie kann ich bei match() noch einen Parameter übergeben?! Also den, damit ich einen String für die Suche angeben kann?
Stelle:

Code: Alles auswählen

#------------------------------------------------------------
    def match(self, row):

        data = dict((name, row[name]) for name in (self.dbCols))
        if 'Max' in data.values(): # 'Max' <-- muss ersetzt werden - Aber wie?
            return data
Ich weiß nicht, wie ich das machen kann...

Fazit: Z.Z. ist es kackegal, ob ich bei adr.get() daten übergebe oder nicht -.- Es wird eh nur der Datensatz von Max rausgesucht :'(
BlackJack

Der Name `match` ist sehr ungünstig. Die Funktion ist nur dazu da um aus einem DictCursor Ergebnis ein echtes `dict` zu machen. Wenn die Bedingung ('Max') nicht zutrifft, dann gibt die Funktion `None` zurück.

Warum bastelst Du die Abfrage nicht schon in die SQL-Anweisung? Dann kümmert sich schon die Datenbank darum.
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

also doch mit einer WHERE Klausel?!
Von der hast du mir abgeraten; wegen SQL Injections - kann ich auch verstehen, nur wusst ich nich, wie ich die umgehen soll.
Im selben Posting haste dann diese row_to_dict Funktion gepostet, deswegen hab ich mir gedacht: Fein, dann hol ich alles, übergeb das der map und die sucht mir dann raus, welche Datensätze zutreffen...
Mittlerweile is mir aufgefallen, warum du mir die Funktion gezeigt hast ^^
Damit die While Schleifen wegkommen - ich habs nur falsch interpretiert :D
Ja gut, aber wie soll ich das dann machen, damit ich den Injections aus dem Weg geh?
BlackJack

Einfach das einsetzen der Werte dem Datenbankmodul überlassen. Schau Dir die Doku zur `execute()` Methode und dem zweiten Parameter an.
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

BlackJack hat geschrieben:Einfach das einsetzen der Werte dem Datenbankmodul überlassen. Schau Dir die Doku zur `execute()` Methode und dem zweiten Parameter an.
Kannst du mir pls den Link zur Doku geben? Ich find die irgendwie nicht :oops:

Greetz
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

CrackPod hat geschrieben:Link zur Doku
Hi CrackPod!

http://docs.python.org/dev/lib/sqlite3- ... jects.html
http://www.python.org/dev/peps/pep-0249/

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten