database - ejemplos - django
¿Hay alguna manera de establecer un tiempo de "vencimiento", después del cual una entrada de datos se elimina automáticamente en PostgreSQL? (2)
¿Hay alguna forma de establecer algún tipo de tiempo de "vencimiento" en las entradas de datos en
PostgreSQL
?
Estoy pensando en algo equivalente a
EXPIRE
en Redis
.
No estoy buscando almacenar una marca de tiempo y luego codificar manualmente algún tipo de trabajo cron para verificar qué entradas han caducado.
Estoy tratando de averiguar si hay alguna característica nativa en PostgreSQL que brinde este tipo de funcionalidad, o si tendría sentido solicitar dicha característica para futuras versiones.
No hay una función de caducidad incorporada, pero si su objetivo es caducar automáticamente los campos y tener la lógica contenida en su base de datos (y, por lo tanto, no hay dependencia externa como un trabajo cron), siempre puede escribir un disparador. A continuación se muestra un ejemplo de un desencadenante que elimina filas de una tabla que tienen una marca de tiempo de más de 1 minuto. Se ejecuta cada vez que se inserta una nueva fila en esa misma tabla. Obviamente, puede configurar el disparador para que se ejecute en otras condiciones y para varias fechas de vencimiento, según sea necesario. Usé el siguiente sitio web como base para esto: http://www.the-art-of-web.com/sql/trigger-delete-old/
CREATE TABLE expire_table (
timestamp timestamp NOT NULL DEFAULT NOW(),
name TEXT NOT NULL
);
INSERT INTO expire_table (name) VALUES (''a'');
INSERT INTO expire_table (name) VALUES (''b'');
INSERT INTO expire_table (name) VALUES (''c'');
select * from expire_table;
timestamp | name
----------------------------+------
2014-09-26 15:33:43.243356 | a
2014-09-26 15:33:45.222202 | b
2014-09-26 15:33:47.347131 | c
(3 rows)
CREATE FUNCTION expire_table_delete_old_rows() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
DELETE FROM expire_table WHERE timestamp < NOW() - INTERVAL ''1 minute'';
RETURN NEW;
END;
$$;
CREATE TRIGGER expire_table_delete_old_rows_trigger
AFTER INSERT ON expire_table
EXECUTE PROCEDURE expire_table_delete_old_rows();
INSERT INTO expire_table (name) VALUES (''d'');
select * from expire_table;
timestamp | name
----------------------------+------
2014-09-26 15:36:56.132596 | d
(1 row)
No. No hay tal característica.
No puedo ver qué hace más que (1) solo una marca de tiempo "caducada" o (2) marca de tiempo + cron-job / pgAgent.
No parece una característica general que se agregaría al núcleo. Simplemente podría codificar una extension para manejar este tipo de cosas, ya sea con un tic llamado desde un trabajo cron o tal vez un proceso de background-worker .
No veo nada en pgxn , por lo que presumiblemente aún no ha habido mucha demanda.