MySQL-Python-DB

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

Hallo liebe Leute,

wie kann ich die in der DB gespeicherten Daten zurückgeben. Ich habs so versucht und kann leider nicht prüpfen ob das richtig ist oder nicht! :(

Code: Alles auswählen

Cursor.execute( ''' 
                        SELECT * FROM 
                            adressesTemp 
                        WHERE 
                            (
                            id = %(id)s
                            ) 
                            ''',
                            {
                            'id':ID
                            }
                            
                        )
        
        row = Cursor.fetchone ()
        if row: 
            return { 
                'id':row[0], 
                'vorname':row[1], 
               .
               .
               .

                'buerofaxnummer':row[12]
                } 
        else: 
            return None 
        
LG,
fanus
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Ist `Cursor` wirklich eine Instanz der Cursor-Klasse? Wenn ja, solltest du den Namen klein schreiben.

Gib doch testweise mal die erhaltenen Daten mit `print` aus.

Hier noch ein Tipp, wie man von MySQLdb Datensätze als Dictionaries zurück bekommt, so dass man auf die Attribute über ihre Namen zugreifen kann (was auch die Wartbarkeit der Anwendung enorm erhöht):

Code: Alles auswählen

import MySQLdb

conn = connect(...)  # insert your connection data
cursor = conn.cursor(MySQLdb.cursors.DictCursor)
Damit kannst du dann deinen gesamten Code ab Zeile 15 soweit verkürzen, dass er komplett durch ein `return cursor.fetchone()` ersetzt werden kann.

Außerdem ist `SELECT *` gerade bei späteren Schemaänderungen problematisch und sollte (ebenso wie Imports in Python) immer explizit die Namen der geforderten Elemente angeben (also etwa `SELECT id, vorname FROM ...`).
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

Y0Gi hat geschrieben:Ist `Cursor` wirklich eine Instanz der Cursor-Klasse? Wenn ja, solltest du den Namen klein schreiben.
sry da hab ich leider vertippt..

Gib doch testweise mal die erhaltenen Daten mit `print` aus.
es scheint so zu klappen..Danke!

Code: Alles auswählen

        while (1):
            row = cursor.fetchone ()
            if row == None:
                break
        print "%s, %s, %s, %s, %s" % (row[0], row[1], row[2], row[3], row[4] )
        

Außerdem ist `SELECT *` gerade bei späteren Schemaänderungen problematisch und sollte (ebenso wie Imports in Python) immer explizit die Namen der geforderten Elemente angeben (also etwa `SELECT id, vorname FROM ...`).
hab ich nicht gewusst...danke fuer den Tipp.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Wenn ich das richtig verstanden habe, ist also eine Formatierung mit %s eher nicht zu empfehlen und man sollte lieber die pyformat Variante nehmen?
BlackJack

Nein man sollte das Einsetzen `execute()` überlassen, also:

Code: Alles auswählen

# Böse:
cursor.execute("INSERT INTO personen (vorname, nachname) VALUES ('%s', '%s')" %
               ("Max, 'x'); DROP TABLE personen; --", 'Mustermann'))

# Gut:
cursor.execute('INSERT INTO personen (vorname, nachname) VALUES (%s, %s)',
               ("Max, 'x'); DROP TABLE personen; --", 'Mustermann'))
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Ups ... :) *Code durch guck und gleich mal an mindesten 5 Stellen Änderungen durchführ*

Danke
fanus
User
Beiträge: 46
Registriert: Dienstag 13. November 2007, 09:53

hallo liebe Leute,

gibts in MySQL sowas wie " SELECT * OHNE {Y, Z} FROM meine_tabelle

ich möchte nicht "SELECT A, B, ...., X FROM meine_tabelle" verwenden!

Danke für Eure Hilfe!
LG,
fanus
BlackJack

Gibt's AFAIK nicht. Die lange Variante wird in der Regel empfohlen, weil sie robuster gegen Änderungen an den Tabellenspalten ist.
Antworten