web-dev-qa-db-fra.com

Comment insérer current_timestamp dans Postgres via python

Je dois insérer des lignes dans PG. L’un des champs est la date et l’heure avec l’horodatage. C’est le moment de l’incident. Je ne peux donc pas utiliser -> la fonction current_timestamp de Postgres au moment de l’insertion. Comment puis-je alors l’insérer? l'heure et la date que j'ai collectées auparavant dans la ligne pg dans le même format que celui qui aurait été créé par current_timestamp à ce moment-là.

42
Max

Un horodatage n'a pas "un format".

La méthode recommandée pour gérer les horodatages consiste à utiliser un PreparedStatement dans lequel vous transmettez simplement un espace réservé dans le code SQL et transmettez un objet "réel" via l'API de votre langage de programmation. Comme je ne connais pas Python, je ne sais pas s'il prend en charge PreparedStatements ni quelle en serait la syntaxe.

Si vous souhaitez insérer un littéral d'horodatage dans votre code SQL généré, vous devez respecter certaines règles de mise en forme lors de la spécification de la valeur (un littéral a un format).

La méthode d'Ivan fonctionnera, bien que je ne sois pas sûr à 100% si cela dépend de la configuration du serveur PostgreSQL.

Une solution indépendante de la configuration (et du langage) permettant de spécifier un littéral d'horodatage correspond au standard SQL ANSI:

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

Oui, c'est le mot clé TIMESTAMP suivi d'un horodatage au format ISO (le mot clé TIMESTAMP définit ce format)

L'autre solution serait d'utiliser la fonction to_timestamp() où vous pouvez spécifier le format du littéral d'entrée.

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

Si tu utilises psycopg2 (et éventuellement une autre bibliothèque client), vous pouvez simplement passer un objet Python datetime ] == en tant que paramètre à une requête SQL:

from datetime import datetime

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

D'autres types Python) pouvant être adaptés en SQL (et renvoyés sous la forme Python lorsqu'une requête est exécutée) sont répertoriés ici .

36
Eugene Yarmash
7
schlingel

Les entrées de date et heure sont acceptées dans presque tous les formats raisonnables, y compris ISO 8601, compatible SQL, POSTGRES traditionnel, etc. Pour certains formats, la commande de la saisie du mois, du jour et de l'année dans la date est ambiguë et il est possible de spécifier la commande attendue de ces champs.

En d'autres termes: écrivez n'importe quoi et cela fonctionnera.

Ou vérifiez cette table avec tous les formats non ambigus.

2
fiatjaf

Bien sûr, il suffit de transmettre une valeur de chaîne pour cette colonne d’horodatage au format: '2011-05-16 15:36:38' (vous pouvez également ajouter un fuseau horaire, comme 'PST'). PostgreSQL ™ convertira automatiquement la chaîne en un horodatage. Voir http://www.postgresql.org/docs/9.0/static/datatype-datetime.html#DATATYPE-DATETIME-INPUT

1
Ivan Krechetov