Seite 1 von 1

Umwandlung einer langen Zahl aus Datenbank verhindern

Verfasst: Freitag 3. August 2012, 11:19
von Chriggi
Servus,

ich möchte den aktuellsten "timestamp" aus meiner Datenbank in eine Datei speichern. Die timestamps sind relativ lange Zahlen, z.B. "1342184977273". Wenn ich nun folgendes durchführe:

Code: Alles auswählen

SELECTQ="SELECT max(timestamp) FROM xxx"
FILENAME="last_timestamp.csv"
dump_writer = csv.writer(open(FILENAME,'w'), delimiter=',',quotechar="'")
cursor = db.cursor()
cursor.execute(SELECTQ)
result = cursor.fetchall()
for record in result:   
    dump_writer.writerow(record)
Dann speichert er folgenden Wert in die Datei: 1.34389796569e+12

Das Problem ist nun, dass ich damit nicht weiterarbeiten kann wenn ich die Datei auslese. Eine einfache Umwandlung in ein Int oder Long funktioniert wegen dem "e" auch nicht. Weiß jemand eine Lösung für dieses Problem?

Re: Umwandlung einer langen Zahl aus Datenbank verhindern

Verfasst: Freitag 3. August 2012, 11:27
von deets
Falsches DB-Design wuerde ich sagen. Solche Daten sollte schon in der DB als TimeStamp abgelegt sein - dann kommen sie auch schon gleich als datettime-Objekte aus der Datenbank raus, und du kannst sie formatieren, wie du magst. Vorzugsweise *nicht* als simple, lange Zahl.

Wenn das nicht aenderbar ist, dann solltest du schon im select die Zahl gleich in einen String umwandeln. Wie genau das geht haengt von deiner akuten Datenbank ab, die erwaehnst du ja nicht.

Last but not least: benutze bitte die python-code-tags wenn du code postest.

Re: Umwandlung einer langen Zahl aus Datenbank verhindern

Verfasst: Freitag 3. August 2012, 11:41
von Chriggi
Direkt im Select das ganze zum String umwandeln hat funktioniert.

Danke für die schnelle Hilfe.

Re: Umwandlung einer langen Zahl aus Datenbank verhindern

Verfasst: Freitag 3. August 2012, 11:50
von BlackJack
@Chriggi: Noch ein paar Anmerkungen:

CSV-Dateien solltest Du im Binärmodus öffnen, sonst kann es unter Betriebssystemen Probleme geben die Zeilenende-Zeichen beim schreiben und lesen nicht unverändert lassen (→ Windows).

Dateien sollte man auch immer schliessen und sich nicht auf die Speicherbereinigung verlassen, die keine Garantien gibt ob und wann sie ausgeführt wird. Am besten man verwendet die ``with``-Anweisung.

Da es nur einen Maximalwert geben kann ist `fetchall()` + Schleife übertieben. Ein einfaches ``dump_writer.writerow(cursor.fetchone())`` sollte genügen. Eventuell muss man sich dann Gedanken über den Sonderfall machen dass die Tabelle leer ist.