Schreiben und lesen timestamps / Postgresql

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
David_123
User
Beiträge: 8
Registriert: Montag 26. Juni 2017, 12:40

Hallo zusammen,
ich bin ganz neu hier und beschäftige mich erst seit kurzem mit Datenbanken und auch Python.
Durch Tutorials, dieses Forum und andere Beispeile im Netz habe ich schon ein paar Dinge erreicht was die Kommunikation zwischen Python 3.6 und einer Postgresql Datenbank angeht. Alles in allem aber noch sehr wackelig. Wenn ich die falschen Begriffe verwende korrigiert mich gerne. Auf eine Belehrung a lá "lies erstmal 2 Jahre lang all die Tutorials im Netz durch" habe ich keine Lust. Wenn Ihr einem Anfänger helfen wollt freue ich mich, wenn nicht, dann seid doch so freundlich und ignoriert meinen Beitrag.

Als erstes habe ich mal eine Tabelle aus Excel in CSV exportiert, diese per Python eingelesen und an die Datenbank übergeben (psycopg2). Dazu habe ich eine Spalte mit Zeitschritten per dt = datetime.datetime.strptime(zeitliste[0], "%d.%m.%Y %H:%M:%S") in ein datetime objekt überführt. In der Datenbank wird der Wert als Data Type "timestamp" verstanden.
Nächstes Experiment war das auslesen der eingelesenen Tabelle. Dabei erstelle ich mir blöderweise aus den Timestamps eine Liste mit Tupeln. Lasse ich mir die Liste anzeigen steht da z.B.(datetime.datetime(1900, 1, 1, 0, 0),(datetime.datetime(1900, 1, 1, 0, 15)). Spreche ich die einzelnen Tupel an verschwindet datetime.datetime und ich bekomme z.B. die Ausgabe 1900-01-01 00:15:00.
Ich möchte einfach nur eine Liste mit datetime Objekten haben. Weil in der Liste datetime.datetime drin steht vermute ich, dass das auch irgendwie ziemlich einfach möglich ist. Vielleicht liegt mein Problem auch bei der SQL Abfrage.

So rufe ich die Liste mit Timestamps ab:

cur.execute("""SELECT zeitstempel FROM public.testslp""")
zeitstempel = cur.fetchall()

Und hier einige Ausgaben:

print(type(zeitstempel[0])) --> <class 'tuple'>

print(type(zeitstempel)) --> <class 'list'>

print(zeitstempel[0]) --> (datetime.datetime(1900, 1, 1, 0, 0),)

stre=(zeitstempel[1])
print(stre[0]) --> 1900-01-01 00:15:00


Ich bedanke mich im voraus für eure Hilfe.

David
David_123
User
Beiträge: 8
Registriert: Montag 26. Juni 2017, 12:40

ah, print(type(stre[0])) --> <class 'datetime.datetime' >
also habe ich hier eine Liste von Tupeln mit Datetime-Objekten ?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Guckst du Doku: https://docs.python.org/2/library/sqlit ... r.fetchall

Und ja, da steht dann genau was du auch bekommst - eine Liste von Tupeln.
David_123
User
Beiträge: 8
Registriert: Montag 26. Juni 2017, 12:40

Vielen Dank.
Warum sind die Datetime Objekte nochmal in Tupels "verpackt"?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil jede Zeile aus der Datenbank *IMMER* ein Tupel ist. Das ist aus Orthonogalitaetsgruenden so. Es waere ueberraschend, wenn du zwei oder mehr Spalten abfragst und ein Tupel bekommst, aber bei nur einer Spalte wird ploetzlich das Tupel "wegoptimiert" wird. Das Interface ist hier generisch, so das anderer Code immer gleich darauf reagieren kann.
Antworten