Lenguajes Procedurales en PostgreSQL: PL/pgSQL y Extensiones Python
Como la mayoría de las bases de datos, PostgreSQL cuenta con conectores para diferentes lenguajes de programación, de tal forma que si trabajas con Python, PHP, Java, JavaScript y todos sus frameworks, exista una forma de extraer datos de PostgreSQL y posteriormente utilizar las propiedades de los lenguajes procedurales para transformar y utilizar los datos.
El lenguaje estándar utilizado en bases de datos relacionales es SQL (Structured Query Language), un lenguaje que tiene una estructura sumamente útil para hacer solicitudes de datos, en especial tomando como abstracción un diseño tabular de datos. Sin embargo, carece de estructuras de control y otras abstracciones que hacen poderosos a los lenguajes procedurales de programación.
PL/pgSQL
Como respuesta a los puntos débiles de SQL como estándar, PostgreSQL respondió originalmente creando un lenguaje propio llamado PL/pgSQL (Procedural Language/PostgreSQL Structured Query Language) que es literalmente un superset de SQL que incluye propiedades de un lenguaje estructurado que, por un lado, nos permite crear funciones complejas y triggers; y, por el otro lado, agrega estructuras de control, cursores, manejo de errores, etc.
Otros lenguajes
Sin embargo, en muchos sentidos, aunque PL/pgSQL ayuda en los casos más genéricos para generar estructuras y funcionalidades más complejas, no se compara con lenguajes completamente independientes y no ligados directamente a una base de datos.
La respuesta sin embargo tampoco es los conectores normales que, si bien resuelven la parte de un lenguaje más complejo, añaden por otro lado una separación de la base de datos, ya que debe correr en un servidor separado y hacer llamadas entre ellos con la latencia como un colateral.
Para mitigar estos problemas tomando lo mejor de ambos mundos, los desarrolladores de PostgreSQL se dedicaron a hacer implementaciones de diversos lenguajes a manera de plugin.
C
La biblioteca que permite al lenguaje C ejecutarse en PostgreSQL es llamada libpq y es una interfaz de programación que permite extender y hacer de interfaz para permitir a otros lenguajes ejecutarse en esta base de datos.
Puedes encontrar más información de esta interfaz en el siguiente link:
Tcl (Tool Command Language) es un lenguaje diseñado con la simpleza en mente y su paradigma consiste en que todo en él es un comando, incluyendo la estructura del lenguaje que, sin embargo, son suficientemente flexibles para poderse sobreescribir, haciéndolo un lenguaje sumamente extensible.
Todo lo anterior es ideal para la integración con el manejador de PostgreSQL ya que permite elaborar comandos para ejecutar las sentencias SQL y extenderlas facilmente.
Si quieres leer más del tema, puedes hacerlo en el siguiente link:
Perl es un lenguaje de programación que implementa una estructura de bloques de código y que toma inspiración de programas como C, sh, AWK, entre otros. Y es especialmente bueno para el tratamiento de cadenas de texto. Sin embargo, no se encuentra limitado como un lenguaje de script.
Dada la propiedad de englobar funcionalidad en forma de bloque y de la rapidez y facilidad con la que trabaja con datos tipo cadena, este lenguaje es ideal para el tratamiento de información de una base de datos relacional.
Para conocer más de la implementación de este lenguaje con PostgreSQL puedes leer el siguiente link:
Python, al ser de los lenguajes de programación más extendidos entre programadores de servicios Backend, es una implementación particularmente interesante para PostgreSQL.
Python es un lenguaje de programación fuerte en tratamiento de estructura de datos y tiene un paradigma múltiple con fuertes componentes orientados a objetos, estructurados y una fuerte influencia del paradigma funcional.
Parte de sus fortalezas son sus implementaciones de funciones map, reduce y filter en conjunto con list comprehensions, sets, diccionarios y generadores.
Dadas las propiedades nativas para manejar estructuras de datos complejas, es un lenguaje ideal para manejar la salida de un query SQL.
La implementación de Python para PostgreSQL te permite crear funciones complejas en un lenguaje completo y popular sin tener que utilizar PL/pgSQL. Puedes ver un ejemplo a continuación de la misma función en PL/pgSQL y PL/Python.
PL/pgSQL
CREATEFUNCTIONpgmax(a integer, b integer)RETURNS integer
AS $$
BEGINIF a > b THENRETURN a;ELSERETURN b;ENDIF;END$$ LANGUAGE plpgsql;
PL/Python
CREATEFUNCTIONpymax(a integer, b integer)RETURNS integer
AS $$
if a > b:return a
return b
$$ LANGUAGE plpythonu;CREATEEXTENSION plpythonu;SELECTpgmax(200,9);
Para instalar el lenguaje Python en PostgreSQL, una vez instaladas las bibliotecas apropiadas para cada Sistema Operativo, es necesario ejecutar el siguiente query:
CREATEEXTENSION plpythonu
Si quieres profundizar más en esta implementación puedes encontrar más información aquí:
Con razón PostgreSQL presume de ser el mejor manejador de bases de datos.
Es muy completo!
Otra razon es por ser open source, ya que si bien nacio la alternativa de MariaDB, PostgreSQL es algo mas robusto y su principal "competidor" en ese sentido era MySQL que paso a ser cerrado cuando paso a manos de Sun MicroSystems y luego a Oracle.
Para los que, al igual que yo, tuvieron problemas al ejecutar la consulta:
CREATEEXTENSION plpythonu
Antes de instalar la extensión hay que asegurarse de tener Python y haber instalado el paquete postgresql-plpython.
En mi caso estoy trabajando con el contenedor "postgres" en Docker, mismo que no trae instalado Python. Lo que hice fue:
#Para instalar Python en su versión 3.7apt-get install python3
#Para instalar el paquete postgresql-plpython
#En mi caso tengo aversión 13 de pgsql
#La nomenclatura debería estar en función dela versión de Python y de la versión de pgsql con la que se trabaja
apt-get install postgresql-plpython3-13
Hecho eso ya se puede ejecutar la consulta:
CREATEEXTENSION plpython3u
#Con el 3 casi al final para denotar que se trabaja con la versión 3.x de python
Para los que no les vale, comparto el comentario de un compañero, debería salirles igual que a mi en el feed de comentarios pero bueno. Aquí está. Me funcionó, espero igual a ustedes. Gracias al compañero que lo compartió.
INSTALACIÓN EN WINDOWS DE POSTGRESQL + Python3 + plpython3u
Ir a
C:\Program Files\PostgreSQL[version]\doc\installation-notes.html
Revisar que versión de Python se usó para compilar tu versión de PostgreSQL, en mi caso es Python3…7
Buscar esa versión e instalarla:
Python para Windows
Registrar en el PATH las carpetas
C:\Users[usuario]\AppData\Local\Programs\Python\Python37
C:\Users[usuario]\AppData\Local\Programs\Python\Python37\scripts
Copiar el archivo python37.dll de:
C:\Users[usuario]\AppData\Local\Programs\Python\Python37
en
C:\Windows\System32
Fuente:
stackoverflow
Hola, gracias por el aporte,
Hice los pasos y y creo la extensión:
CREATE EXTENSION plpython3u;
pero al ejecutar la creación de la función :
CREATE FUNCTION pymax (a integer, b integer)
RETURNS integer
AS $$
if a > b:
return a
return b
$$ LANGUAGE plpythonu;
me parece este error:
ERROR: no existe el lenguaje «plpythonu»
HINT: Use CREATE EXTENSION para cargar el lenguaje en la base de datos.
SQL state: 42704
Gracias por tu ayuda.
En '$$ LANGUAGE plpythonu' te faltó el 3, es decir, escribe:
$$ LANGUAGE plpython3u
¿Se pueden importar librerías de python dentro del bloque?, ¿Se podrían generar archivos desde el bloque de python y guardarlos en el disco?
Llegue con la soluciona para casi todos los comentarios que no pudieron ejecutar el PL/Python, lo logre con un dockerfile:
version:'3.9'services:db:build:.container_name: postgres
restart: always
#1)Que es la imagen en docker?Bueno, en este caso, estariamos obteniendo de manera PUBLICA la IMAGEN es decir...LAAPLICACION postgres! #env_file: # -.envenvironment:-POSTGRES_DB=${POSTGRES_DB}-POSTGRES_USER=${POSTGRES_USER}-POSTGRES_PASSWORD=${POSTGRES_PASSWORD}ports:-5432:5432 #5)Aca es donde conecto mi servidor con mis datos, ent este caso como es local, es decir, no conecto con un servidor en la nube, tan solo uno miData:conElServidorQueConectare En este caso ambos son 5432, ya que estoy conectando mi data a mi propio servidor local de mi pc, nignnuno de la nube
volumes: #5)El volumes nos sirve para crear persistencia, es decir,"Todo lo que yo tenga en mi contendor, quiero almacenarlo YO en un archivo para mayor seguridad".-/postgres-data:/var/lib/postgresql/data
#6)El./postgres_data significa que justamtene el archivo que se creara para que se guarde la data esta en la carpeta ./postgres_data,(a su vez debe ser privadad, asi que no la subas a github)Mientras que por otro lado tenemos el /var/lib/postgresql/data, que hace esta ruta?Bueno simplemente hay que entender que esta ruta conecta con la base de datos, es decir, los datos estan guardados en esta ruta en postgresql...PORLOTANTONOSOTROSPARACREARPERSISTENCIAABSROBEMOSLADATADEVAR/LIB/POSTGRESQLETCYLALLEVAMOSAPOSTGRES_DATA.SABIENDOQUENODEBEIRAGITHUB. #7)Es importante saber que la ruta /var/lib/postgresql/data es de donde obtenemos la imagen.Pero esta ruta puede variar por cuestion de la empresa queu crea la db y demas, entonces la manera de siempre tener esta ruta lista para absorber la imagen es consultando la documentacion de hub.docker.compgadmin:image: dpage/pgadmin4
environment:-PGADMIN_DEFAULT_EMAIL=root@mail.com-PGADMIN_DEFAULT_PASSWORD=04145893431ports:-5050:80 #Metabase para visualizaciones
dataviz:image: metabase/metabase
container_name: metabase
restart: always
environment:-MB_DB_TYPE=postgres
-MB_DB_DBNAME=${POSTGRES_DB}-MB_DB_PORT=5432-MB_DB_USER=${POSTGRES_USER}-MB_DB_PASS=${POSTGRES_PASSWORD}-MB_DB_HOST=db
-MB_DB_FILE=/metabase-data/metabase.dbdepends_on:- db
volumes:- dataviz_data:/metabase-data
ports:-3000:3000volumes:postgres_data:{}db_data:dataviz_data:
archivo .env
# PostgresPOSTGRES_DB=my_db
POSTGRES_USER=root
#modificar la password o estos datos con los suyos
POSTGRES_PASSWORD=mypassword
Correr:
docker-compose up -d postgres
DE NADA...
CREATEEXTENSION plpython3u;CREATEFUNCTIONpymax(a integer, b integer)RETURNS integer
AS $$
if a > b:return a
return b
$$ LANGUAGE plpython3u;SELECTpymax(200,9);
Super, no sabía que Postgresql podia trabajar con Python
Para los que tengan Windows y hayan seguido las instrucciones de los otros compañeros, y aún así sale error, intenten la segunda opción:
ERROR: no se pudo acceder al archivo «$libdir/plpython2»:No such file or directory
SQLstate: 58P01
La segunda me funcionó bien.
HELP!
Logré por fin crear la extensión plppython3u, pero me desconecta de la base de dato cada vez que corro la función y no logró encontrar cómo solucionarlo.
lograste resolver el problema? yo he intentado varias maneras pero se desconecta
No, intente de todas las maneras, pero no lo logré al final.
La informacion es buena. Pero creo que esta clase tuvo que haber sido grabada.
se nesecita tener la version adecuada para correr python en postgres
PostgreSQL Version---- Python Version
PostgreSQL 16--------- Python 3.12.x from python. org
PostgreSQL 15--------- Python 3.11.x from python. org
PostgreSQL 14--------- Python 3.9.x from python. org
PostgreSQL 13--------- Python 3.8.x from python. org
PostgreSQL 12 and earlier Python 2.7 (included with macOS)
Esto es increíble el poder que puede tener combinar diferentes lenguajes dentro del motor de base de datos :D
Necesito tu ayuda!, No puedo agregar ningun lenguaje me dice que no puede ser encontrado este archivo por ejemplo plpython3.dll, pero SI ESTA! no se porque no puedo instalar mi primera extencion con python
ERROR: no se pudo cargar la biblioteca «C:/Program Files/PostgreSQL/11/lib/plpython3.dll»: The specified module could not be found.
Es cierto, estaré ahondando en este error y si tengo resultados compartiré como lo solvente, si lo logran por favor les encargo así mismo compartirlo, esto nos ayuda a crecer y ayudará a futuros colegas. Saludos.
Como les fue pudieron solucionarlo,yo no
Que interesante poder usar otros lenguajes en el motor de bases de datos de PostgreSQL, me encantaría ver muchas más aplicaciones de Python dentro de PostgreSQL, suena muy interesante!
Muy buenas integraciones, buenos datos lo cual me permite ver el gran potencial que tiene postgreSQL
Sin duda esto le da un plus importante a PostgreSQL, esto su compatibilidad con servicios de AWS, lo ponen hoy como mi favorito.
Hola compañeros
No puedo correr la PL/Python. Postgre se desconecta cada que quiero correr el bloque de codigo
Ya cree la extensión y no hubo ningun error.
Alguna ayuda?

Yo tengo el mismo error, ¿Pudiste solucionarlo?
No christopher, sigo con el mismo problema
Muy completo en verdad
SOLUCION PARA MAC CON BREW
# 1. Detener el servicio
brew services stop postgresql@18
# 2. Desinstalar el de homebrew/core
brew uninstall postgresql@18
# 3. Instalar el de petere (que incluye plpython3u)
brew install petere/postgresql/postgresql@18
# 4. Confirmar que plpython3 se instaló
find /opt/homebrew -name "plpython3*" 2>/dev/null
#5. Encender el servidor
pg_ctl -D /opt/homebrew/var/postgresql@18 start
#6. En pgAdmin correr dentro de la base de datos en uso
CREATE EXTENSION plpython3u;
OJO, REPETIR EN CADA BASE DE DATOS A USAR
Hola,
Me aparece este error:
ERROR: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
Alguien sabe como corregirlo ?
Gracias
Ya le di muchas vueltas y no he podido integrar python3 con postgresql ejecutandose en Mac :( ¿Alguien sabe como hacerlo?