Konvertierung der MySQL-Datentypen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Caldar
User
Beiträge: 46
Registriert: Sonntag 17. Mai 2009, 18:20

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?
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.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
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.
Benutzeravatar
sehbaer
User
Beiträge: 39
Registriert: Sonntag 30. März 2008, 17:26
Wohnort: Kölle

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)...
...es sind ganz bestimmt mehr Nullen als Einsen.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Antworten