Creación de una base de datos PostgreSQL con Docker al inicio

Aún con el reciente auge de las bases de datos NoSQL las bases de datos relacionales siguen siendo la opción usada mayoritariamente para persistir los datos de una aplicación. Una característica deseada de las bases de datos relacionales es la de mantener con transacciones la integridad referencial y consistencia de los datos en todo momento que las bases de datos NoSQL no ofrecen aunque estas últimas a cambio ofrecen mejores opciones para escalar.

De las bases de datos relacionales más utilizadas que tienen una licencia de software libre están MySQL, MariaDB y PostgreSQL, con licencia privativa y comerciales están Microsoft SQL Server, Oracle y DB2 siendo su coste significativo en algunos casos solo alcanzable por grandes organizaciones.

De todas las funcionalidades que tiene SQL muchos desarrolladores solo usamos un pequeño conjunto de las posibilidades del lenguaje. Algunas bases de datos no implementan muchas posibilidades del lenguaje SQL y no son usables en esos sistemas, PostgreSQL es una de las bases de datos relacionales que mejor soporta el estándar ANSI-SQL. Muchos desarrolladores conocemos las opciones básicas del lenguaje SQL, las sentencias insert, update, delete y select, sin embargo las últimas versiones del lenguaje SQL añade muchas posibilidades que quizá desconozcamos.

PostgreSQL por ejemplo soporta inserciones de múltiples filas en una misma sentencia, actualización o inserción con la sentencia upsert, window functions, common table expressions o consultas recursivas. Veamos algunos ejemplos de estas características del lenguaje SQL y que PostgreSQL soporta siendo una de las bases de datos relacionales más ANSI-SQL compliant.

Para los casos demostrativos de las sentencias SQL usaré una base de datos de ejemplo con unas pocas tablas y datos sobre ciudades, países, población y lenguajes obtenida de PgFoundry Sample Databases, hay varias en concreto usaré la base de datos world. Para una fácil instalación de una instancia de la base de datos PostgreSQL usaré Docker con la que una vez terminados los ejemplos se puede eliminar sin dejar ningún rastro.

Lea también: Impulso Tecnológico en Francia

Una vez instalado Docker e iniciado su servicio y con el comando docker-compose y el archivo docker-compose.yml que contiene la definición del contenedor lo iniciamos con el comando docker-compose up.

El shell de psql usa varios comandos precedidos por una contrabarra para interpretar algunos comandos muy útiles como listar las bases de datos, cambiar de base de datos de trabajo, listar las tablas de una base de datos, mostrar la definición de una tabla para saber sus campos y tipos o salir del shell.

En algún caso quizá tengamos la necesidad de hacer un insert y si el registro ya existe hacer un update. Las cláusula WITH que define las common table expressions o CTE proporcionan una forma de escribir sentencias auxiliares para su uso en una sentencia más grande. Las window functions realizan cálculos sobre un conjunto de datos que están relacionados de alguna forma con la fila actual.

Usando la base de datos world que contienen ciudades y países con sus poblaciones con la siguiente consulta SQL se obtienen las tres ciudades más pobladas de Alemania, España, Francia e Italia con su porcentaje respecto al total del país. En este caso Berlín es la ciudad más poblada de Alemania con aproximadamente el 12% de la población de ese país.

El modificador RECURSIVE cambia la sentencia WITH de una conveniencia sintáctica en una funcionalidad que proporciona algo que no sería posible con el SQL que soporta algunas otras bases de datos. Usando RECURSIVE, una cláusula WITH puede referenciar su propia salida.

Lea también: Startup Day Unibo: Agroalimentación

Con la ayuda de los arrays podemos definir una columna con un conjunto de valores que en casos simples nos evitarán crear una tabla con una relación 1 a N. En PostgresSQL se pueden definir nuevos tipos de datos así como nuevas funciones sobre estos tipos de datos. Una vez definidos las columnas de las tablas pueden hacer uso de ellos.

Arrays: las columnas de una tabla se pueden definir como un array multidimensional de longitud variable. Los índices cuando son utilizados son una forma que mejora enormemente el rendimiento de una consulta. Un índice parcial es un índice construido sobre un subconjunto de una tabla, el subconjunto es definido por una expresión condicional.

La motivación de los índices parciales es evitar indexar valores comunes. Dado que una búsqueda para un valor común no usará el índice de todas maneras no hay necesidad de mantener esas filas en el índice. Un índice puede ser definido sobre más de una columna de una tabla.

Los tipos de datos son una forma de limitar los tipos de datos que pueden ser almacenados en una tabla. Para muchas aplicaciones las restricciones que proporcionan son demasiado simples. Por ejemplo, una columna que contenga el precio de un producto debería aceptar solo valores positivos. Pero no hay un tipo de datos que acepte solo números positivos.

Otro problema es que quizá deseemos restringir el dato de una columna respecto a otras columnas o filas. SQL permite definir restricciones en columnas y tablas proporcionando el control sobre los datos que deseamos. Si se especifica en la creación de la tabla TEMPORARY o TEMP esta es creada con una tabla temporal que es eliminada al final de la sesión u opcionalmente al finalizar la transacción actual. Si se especifica UNLOGGED es creada como no trazable haciendo que los datos escritos en la tabla no sean escritos en el write-ahead log que lo hace considerablemente más rápido que las tablas ordinarias.

Lea también: Ejemplos Estructura Startup

PostgreSQL al igual que otras bases de datos ofrece un lenguaje procedural que puede ser usado para crear procedimientos de funciones o triggers, añadir estructuras de control al lenguaje SQL, realizar cálculos complejos, hereda todos los tipos de usuario, funciones y operadores, puede ser definido como de confianza por el servidor y es fácil de usar.

El lenguaje sql es fácil de aprender y es común a las bases de datos relacionales pero cada sentencia SQL debe ser ejecutada individualmente por el servidor. Esto significa que la aplicación cliente debe enviar cada sentencia al servidor, esperar a que sea procesada, recibir y procesar los resultados, realizar algún cálculo y entonces enviar más sentencias al servidor.

Con PL/pgSQL se puede crear un bloque de computación y una serie de sentencias SQL dentro del servidor de base de datos, tiendo el poder de un lenguaje procedural y la facilidad de SQL pero con un considerable ahorro de comunicación entre cliente y servidor. Las ventajas son evitar viajes entre el servidor y el cliente, resultados inmediatos que no son necesarios convertir y transferir entre el cliente y servidor y múltiples pasos de procesado de las sentencias son evitados.

Por todas estas características se considera a PostgreSQL una de las bases de datos relacionales más avanzadas existentes. De PostgreSQL ya hemos hablado en varias entradas en la web, en el día de hoy veremos como preparar una base de datos remota.

Para ello nos serviremos de la consola de comandos en un servidor con Centos 7.Como seguramente ya sabrás, por defecto, para empezar a trabajar con este motor de base de datos, debemos utilizar la primera vez un script, «engine-setup«, que configura las bases de datos básicas, para el buen funcionamiento de este. Partimos de la base que acabamos de instalar este motor de base de datos, como por ejemplo en Centos o en Debian.

Una vez hecho, utilizando «systemd«, tendremos que arrancar el ‘daemon‘, pero antes de eso, debemo inicilizarlo. Otra parte importante es crear un usuario por defecto. En este ejemplo se habilita el acceso desde todas las interfaces.

Y con esto ya lo tendrmeos listo. Como alternativa, abra este inicio rápido en GitHub Codespaces con todos los requisitos previos para desarrolladores ya instalados. Solo tiene que traer su propia suscripción de Azure. Las cuentas de GitHub incluyen un derecho de almacenamiento y horas de núcleo sin costo alguno.

Empiece por configurar y ejecutar la base de datos local. Inicie el contenedor de Docker estableciendo la contraseña y el puerto de publicación 5432. Conéctese a la base de datos local mediante el entorno de administración de datos preferido. Si usa la configuración de red predeterminada para las imágenes de contenedor de Docker Linux, es probable que la cadena de conexión sea Host=localhost;Port=5432;User ID=postgres;Password=<your-password>;.

Cree un archivo de configuración de línea base mediante la CLI de DAB. Cree un archivo de configuración típico mediante dab init. Agregue el argumento --connection-string con la cadena de conexión de su base de datos de la primera sección. Reemplace <your-password> por la contraseña que estableció anteriormente en esta guía. En este ejemplo, la aplicación se ejecuta en localhost el puerto 5000.

tags: #docker #postgres #create #database #on #startup