Seite 1 von 1

Konvertierung der MySQL-Datentypen

Verfasst: Freitag 26. Juni 2009, 15:47
von Caldar
Ich habe MySQL-Tabellen, in denen Werte als DECIMAL(12,4) gespeichert sind.
Wenn ich diese dann mit dem entsprechenden SQL-Befehlen cursor.execute(~SQL-Query~) auslese, habe ich im ResultSet
Tupel-Objekte für die einzelnen Werte.

Code: Alles auswählen

import MySQLdb
conn = MySQLdb.connect("localhost", "root", db="xyz")
curs = conn.cursor()

val = []

sql = """SELECT `ped_local`     
    FROM `data` 
    WHERE `timestamp` >1167606000
    AND `timestamp` <1167608400
    """

curs.execute(sql)
values = []
for row in curs:
        row = values.append(row)

for row in values:
    print row
Das Ergebnis sieht dann so aus:
Decimal("9.1000"),)
(Decimal("9.5000"),)
(Decimal("9.1000"),)
(Decimal("9.5000"),)
(Decimal("9.8000"),)
(Decimal("8.0000"),)
(Decimal("10.0000"),)
(auszugsweise) und der Datentyp ist Tuple

Wie kann ich diese Tuple-Werte (also nur die Gleitkommazahlen) nun in einer Liste als Gleitkommawerte speichern, so dass für jeden Wert der von MySQL zurückgegeben wird, dieser fortlaufend in eine Liste gespeichert wird?

Verfasst: Samstag 27. Juni 2009, 00:24
von BlackJack
@Caldar: `val` wird nicht verwendet und was soll die Zuweisung an `row`?

Lies in der Python Doku nach was man mit Tupeln machen kann, insbesondere wie man auf einzelne Elemente zugreift. Und dann schreibst Du entweder eine ``for``-Schleife oder eleganter eine "list comprehension" die das Problem löst.

Verfasst: Sonntag 28. Juni 2009, 20:15
von noisefloor
Hallo,
Lies in der Python Doku nach was man mit Tupeln machen kann.
Ich denke, das Problem von Caldar ist nicht, wie man an die Einzelwerte kommt, sondern dass das Ergebnis z.B. DECIMAL("9.1000") ist und eben nicht 9.1000.

Ich hatte mal das gleiche Problem und habe es mit lstrip() und rstrip() gelöst.

Das sieht aber irgendwie sehr unelegant aus... :?

Gruß, noisefloor

Verfasst: Sonntag 28. Juni 2009, 20:33
von BlackJack
Vor allem geht es nicht. Es sei denn Du hast die Decimal-Objekte tatsächlich mit `repr()` in eine Zeichenkette umgewandelt. Statt zum Beispiel `float()` darauf anzuwenden.

casten

Verfasst: Sonntag 28. Juni 2009, 21:03
von sehbaer
Du könntest in der SQL Abfrage den Datentyp bereits casten. MySQL Dialekt habe ich nicht so drauf, könnde aber so aussehen:

Code: Alles auswählen

SELECT CAST(ped_local as float)...

Verfasst: Montag 29. Juni 2009, 07:18
von noisefloor
Hallo,

@Balckjack: Yup, hinterher ist mir auch eingefallen, dass an meinem letzten Post etwas unsinnig ist. :oops: Die MySQL abfragt gibt ja nicht unbedingt Strings zurück.

@caldar:

mit

Code: Alles auswählen

values = map(float,values)
sollte es gehen.

Gruß, noisefloor