Secuenciador python para postgres

bases de datos y persistencia
Instrucciones

PostgreSQL posee la capacidad de definir distintos secuenciadores que sirven para dar valores por defecto a campos numéricos con lo que numerar los registros que vamos introduciendo. Con los lenguajes procedurales es posible llevar más allá estas posibilidades, y como muestra un botón: un secuenciador fibonacci hecho en python:

-- Creación de la tabla de prueba
CREATE TABLE prueba (id integer, nombre text);

-- Generador de números de fibonacci
CREATE FUNCTION fibgen() RETURNS integer AS '
#buscar los dos valores mayores
r=plpy.execute("select id from prueba order by id desc limit 2" )

if len(r)==2:
  a,b=r[1]["id"],r[0]["id"]
elif len(r)==1:
  a,b=r[0]["id"],0
else:
  a,b=1,0

return a+b'
LANGUAGE 'plpythonu';

-- Asignar el secuenciador
ALTER TABLE prueba
  ALTER COLUMN id SET DEFAULT fibgen();

Podemos probar su funcionamiento introduciendo algunos valores

INSERT INTO prueba(nombre) VALUES ('Primero');
INSERT INTO prueba(nombre) VALUES ('Segundo');
INSERT INTO prueba(nombre) VALUES ('Tercero');
INSERT INTO prueba(nombre) VALUES ('Cuarto');
SELECT * FROM prueba;

--  id | nombre
-- ----+---------
--   1 | Primero
--   1 | Segundo
--   2 | Tercero
--   3 | Cuarto
-- (4 filas)

Si forzamos el valor del campo, vemos que el secuenciador se "ajusta" a los nuevos parámetros

INSERT INTO prueba(id,nombre) VALUES(100,'Cien');
INSERT INTO prueba(nombre) VALUES('CienUno');
INSERT INTO prueba(nombre) VALUES('CienDos');
SELECT * FROM prueba;

--  id | nombre
-- ----+---------
--   1 | Primero
--   1 | Segundo
--   2 | Tercero
--   3 | Cuarto
-- 100 | Cien
-- 103 | CienUno
-- 203 | CienDos
-- (7 filas)