it-swarm.com.de

So fügen Sie current_timestamp über python in Postgres ein

Ich muss Zeilen in PG einfügen. Eines der Felder ist Datum und Uhrzeit mit Zeitstempel. Dies ist die Uhrzeit des Vorfalls. Daher kann ich die Funktion -> current_timestamp von Postgres zum Zeitpunkt des Einfügens nicht verwenden. Wie kann ich dann einfügen? Die Uhrzeit und das Datum, die ich zuvor in der pg-Zeile in demselben Format erfasst habe, wie es zu diesem Zeitpunkt von current_timestamp erstellt worden wäre.

42
Max

Ein Zeitstempel hat kein "Format".

Der empfohlene Weg, mit Zeitstempeln umzugehen, ist die Verwendung eines PreparedStatements, bei dem Sie lediglich einen Platzhalter in SQL übergeben und ein "reales" Objekt über die API Ihrer Programmiersprache übergeben. Da ich Python nicht kenne, weiß ich nicht, ob es PreparedStatements unterstützt und wie die Syntax dafür aussehen würde.

Wenn Sie ein Zeitstempelliteral in Ihre generierte SQL einfügen möchten, müssen Sie bei der Angabe des Werts einige Formatierungsregeln befolgen (ein Literal hat ein Format).

Ivans Methode wird funktionieren, obwohl ich nicht 100% sicher bin, ob es von der Konfiguration des PostgreSQL-Servers abhängt.

Eine von der Konfiguration (und Sprache) unabhängige Lösung zur Angabe eines Zeitstempelliteral ist der ANSI-SQL-Standard:

 INSERT INTO some_table 
 (ts_column) 
 VALUES 
 (TIMESTAMP '2011-05-16 15:36:38');

Ja, das ist das Schlüsselwort TIMESTAMP gefolgt von einem im ISO-Stil formatierten Zeitstempel (das Schlüsselwort TIMESTAMP definiert dieses Format)

Die andere Lösung wäre die Verwendung der Funktion to_timestamp(), mit der Sie das Format des Eingabeliteral angeben können.

 INSERT INTO some_table 
 (ts_column) 
 VALUES 
 (to_timestamp('16-05-2011 15:36:38', 'dd-mm-yyyy hh24:mi:ss'));
63

Wenn du benutzt psycopg2 (und möglicherweise eine andere Client-Bibliothek), können Sie einfach ein Python datetime -Objekt als Parameter übergeben zu einer SQL-Abfrage:

from datetime import datetime

dt = datetime.now()
cur.execute('INSERT INTO some_table (somecol) VALUES (%s)', (dt,))

Weitere Python -Typen, die in SQL angepasst werden können (und als Python -Objekte zurückgegeben werden, wenn eine Abfrage ausgeführt wird)) sind aufgeführt hier .

36
Eugene Yarmash
7
schlingel

Eingaben von Datum und Uhrzeit werden in nahezu jedem vernünftigen Format akzeptiert, einschließlich ISO 8601, SQL-kompatibel, traditionellem POSTGRES und anderen. Bei einigen Formaten ist die Reihenfolge der Datumseingaben für Monat, Tag und Jahr nicht eindeutig, und es wird unterstützt, die erwartete Reihenfolge dieser Felder anzugeben.

Mit anderen Worten: Schreiben Sie einfach alles und es wird funktionieren.

Oder überprüfen Sie diese Tabelle mit allen eindeutigen Formaten.

2
fiatjaf

Übergeben Sie einfach einen Zeichenfolgenwert für diese Zeitstempelspalte im Format: '2011-05-16 15:36:38' (Sie können dort auch eine Zeitzone anhängen, z. B. 'PST'). PostgreSQL konvertiert den String automatisch in einen Zeitstempel. Siehe http://www.postgresql.org/docs/9.0/static/datatype-datetime.html#DATATYPE-DATETIME-INPUT

1
Ivan Krechetov