2011-05-16 50 views
23

Necesito insertar filas en PG uno de los campos es fecha y hora con marca de tiempo, este es el momento del incidente, por lo que no puedo usar -> current_timestamp función de Postgres en el momento de la inserción, entonces ¿cómo puedo luego insertar la hora y la fecha que recolecté antes en la fila pg en el mismo formato que habría sido creado por current_timestamp en ese momento?Cómo insertar current_timestamp en Postgres a través de python

Respuesta

44

Una marca de tiempo no tiene "un formato".

La forma recomendada de tratar con las marcas de tiempo es utilizar un Estado Preparado en el que acaba de pasar un marcador de posición en el SQL y pasar un objeto "real" a través de la API de su lenguaje de programación. Como no conozco Python, no sé si admite PreparedStatements y cómo sería la sintaxis para eso.

Si desea poner un literal de marca de tiempo en su SQL generado, deberá seguir algunas reglas de formato al especificar el valor (un literal tiene un formato).

El método de Ivan funcionará, aunque no estoy 100% seguro si depende de la configuración del servidor de PostgreSQL.

Una configuración (y el idioma) solución independiente para especificar una marca de tiempo literal es el estándar ANSI SQL:

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

Sí, esa es la palabra clave TIMESTAMP seguido de una marca de tiempo con formato de estilo ISO (la palabra clave TIMESTAMP define que formato)

La otra solución sería utilizar la función to_timestamp() donde puede especificar el formato del literal de entrada.

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

gracias this -> format ('Y-m-d H: i: s'); está trabajando para mí –

1

Fecha y hora de entrada es aceptada en casi cualquier formato razonable, incluyendo ISO 8601, tradicionales, POSTGRES compatible con SQL, y otros. Para algunos formatos, el orden de entrada de fecha de mes, día y año es ambiguo y hay soporte para especificar el orden esperado de en estos campos.

En otras palabras: simplemente escriba cualquier cosa y funcionará.

O marque this table con todos los formatos inequívocos.

-4

Sólo tiene que utilizar

ahora()

o

CURRENT_TIMESTAMP

prefiero este último, ya que no gusta tener paréntesis adicional, pero eso es sólo personales preferencia.

+1

La pregunta especifica: "No puedo usar -> función current_timestamp de Postgres en el momento de la inserción". –

17

Si utiliza psycopg2 (y posiblemente alguna otra biblioteca de cliente), puede simplemente pasar una datetime objeto de Python como parameter a una consulta SQL:

from datetime import datetime 

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

Más tipos de Python que se puede adaptar a SQL (y devuelto como objetos de Python cuando se ejecuta una consulta) se enumeran here.

+3

debe evitar pasar un objeto naive datetime que representa la hora local: puede ser ambiguo y la conexión db puede usar una zona horaria diferente. Utilice un objeto de fecha y hora conocido como 'datetime.now (timezone.utc)' y asegúrese de que "timestamp with timezone" se use en el lado de db. – jfs

0

puede probar esto,

from datetime import datetime as dt 
then use this in your code: 

cur.execute('INSERT INTO my_table (dt_col) VALUES (%s)', (dt.now(),)) 
Cuestiones relacionadas