#import "@preview/hydra:0.6.1": hydra #import "@preview/diagraph:0.3.6": raw-render #import "@preview/suboutline:0.3.0": suboutline #set document( title: "Bases de datos FOSS", author: "MiguelMJ" ) #set text(lang: "es") #set page( paper: "presentation-16-9" ) #set text( lang: "es", font: "Source Sans Pro", size: 24pt ) #set align(horizon) #set image(height:100pt) #set table(stroke: 0pt) #show outline.entry: it => link( it.element.location(), it.indented( it.prefix(), it.body()) ) #show link: it => if type(it.dest) == str and it.dest.starts-with("https:/") { underline(it, stroke: blue) } else { it } #show raw.where(block: true): it => rect(stroke:gray, inset: 0.5em, width: 100%, it) #show heading: set block(spacing: 1.5em) #show heading.where(level: 3) : set block(spacing: 1em) #page(margin: (top: 20%))[ #show heading: set block(spacing: 0.5em) #set align(top) #heading(outlined:false)[Bases de datos en un contexto FOSS] Una introducción práctica a PostgreSQL #line(length:60%) Miguel Mejía J.#linebreak() 2026 #place(bottom + left)[ #table(columns: (auto,auto), image("assets/image.png", height: 40pt), image("assets/image-2.png", height: 40pt) ) ] #place( bottom+right, link( "https://openbokeron.org/es", image("assets/image-1.png") ) ) ] #page[ #outline(depth: 1) ] #set page( header: context { set text(fill: gray) strong(hydra(2)) h(1fr); strong(hydra(1)) } ) #let section-page = secname => { show heading: smallcaps; show heading: set text(42pt); page( align( center, heading( level:1, secname ) ) ) } #section-page[Introducción] #page[ #place( bottom + left, image("assets/image-7.png") ) #quote( attribution: link("https://survey.stackoverflow.co/2024/technology#most-popular-technologies-database", "2024 Stack Overflow Developer Survey"), block: true )[ *PostgreSQL* debuted in the developer survey in 2018 when 33% of developers reported using it, compared with the most popular option that year: MySQL, in use by 59% of developers. Six years later, #text(fill:red)[*PostgreSQL is used by 49% of developers*] and is the most popular database for the second year in a row. ] ] #page(align(center,image("assets/image-4.png", height: 1fr))) #page[ #image("assets/image-6.png", width: 100%, height: auto) #text(size: 20pt)[Captura de pantalla de https://www.postgresql.org/about/licence] ] #section-page[Pasos previos] #page[ == Fundamentos #align( center, raw-render( ```dot graph { server[label="Servicio\n(BBDD)"] c1[shape=box, label="Cliente 1"] c2[shape=box, label="Cliente 2"] c3[shape=box, label="Cliente 3"] c4[shape=box, label="Cliente N"] server -- {c1 c2 c3 c4} } ``` ) ) En lugar de acceder directamente a los datos, los procesos que usan la BBDD se conectan (por _socket_ o por IP) a un proceso (un _servicio_) que atiende sus peticiones. ] #page[ == Alcance de este taller + Levantar un *servidor* PostgreSQL. + Conectarnos a él mediante distintos *clientes*: - `psql` (CLI) - DBeaver (GUI). - Python (Aplicación propia). + ¡Trastear! ] #page[ == Descarga e instalación del software === PostgreSQL - https://www.postgresql.org/download/linux (Linux - Debian, Redhat, SUSE, Ubuntu) - https://www.geeksforgeeks.org/installation-guide/how-to-install-postgresql-on-arch-based-linux-distributions-manjaro (Linux - Arch, Manjaro) - https://www.w3schools.com/postgresql/postgresql_install.php (Windows) ] #page[ ==== Notas sobre Windows - Durante la propia instalación se configura una base de datos. - De los componentes que ofrece el instalador, nos interesa solo: - `PostgreSQL Server` - `Command Line Tools` ] #page[ === DBeaver #place( top+right, image("assets/image-8.png") ) DBeaver Community - https://dbeaver.io - Soporte para múltiples sistemas gestores de BBDD (PostgreSQL, MySQL, Oracle, MariaDB, SQLite, entre otros) - Licencia de código abierto (Apache 2.0) #set text(fill: gray) DBeaver Pro (versión cerrada) - https://dbeaver.com ] #page[ === Python & psycopg2 - https://www.python.org/downloads - https://pypi.org/project/psycopg2 === Otros drivers - https://www.postgresql.org/download/products/2-drivers-and-interfaces/ ] #section-page[Configurando y levantando PostgreSQL] #page[ == Conceptos iniciales #set align(horizon + center) #raw-render( ```dot digraph { rankdir=LR node [shape=box] cluster [shape=folder, label="Cluster"] db [shape=cylinder, label="Database"] sch1 [label="Schema 1"] sch2 [label="Schema 2"] sch3 [label="Schema 3"] obj1 [label="Tables"] obj2 [label="Views"] obj3 [label="Sequences"] obj4 [label="Indices"] cluster -> db -> {sch1 sch2 sch3} sch1 -> {obj1 obj2 obj3 obj4} } ``` ) ] #page[ - *Cluster* - A efectos de este taller, es un directorio en el sistema de ficheros (directorio de datos). - *Base de datos* - Almacenada en un _cluster_, formada por _esquemas_. - *Esquema* - Espacio de nombres. Permite una gestión modular. - *Tablas* - Conjuntos de datos estructurados. ] #page[ - *Usuario de BBDD* - Para autenticación y autorización. #rect(width: 100%, inset: 1em)[ #align(center)[ Usuario del SO $!=$ Usuario de BBDD ] ] - Se recomienda que PostgreSQL se gestione con un usuario propio en el sistema operativo, para un mejor control de acceso. En Linux, la propia instalación de PostgreSQL suele encargarse de crear uno llamado `postgres`. - Además, el superusuario de la BBDD también se llama `postgres`. ] #page[ == Siguientes pasos #suboutline(depth: 4, title: none, indent: 0pt) ] #page[ === Inicializar el cluster ```bash $ sudo -i -u postgres $ initdb --locale $LANG -E UTF8 -D '/var/lib/postgres/data/' ``` === Arrancar el servicio ```bash $ sudo systemctl start postgresql $ sudo systemctl status postgresql ``` ] #page[ === Cambiar contraseña por defecto de postgres Para modificarlo, nos conectamos mediante la herramienta `psql` (en Windows, `SQL Shell`). ```bash $ sudo -u postgres psql postgres=# ALTER USER postgres WITH PASSWORD 'my_pass'; ``` ] #page[ === Configurar autenticación Debemos modificar el fichero de configuración correspondiente. ```bash $ sudo -u postgres nano '/var/lib/postgres/data/pg_hba.conf' ``` El fichero `pg_hba.conf` se encuentra en la raíz del directorio de datos que indicamos al inicializar el cluster. También en el caso de Windows. ] #page[ `pg_hba.conf` ```conf # TYPE DATABASE USER ADDRESS METHOD local all all peer host all all 127.0.0.1/32 scram-sha-256 host all all ::1/128 scram-sha-256 ``` - `local` se refiere a las conexiones por socket de Unix (ejemplo: `psql`). - `host` se refiere a las conexiones por IP. - `peer` sólo comprueba que el usuario de SO coincide con el de BBDD (delega la autenticación al sistema operativo). - `scram-sha-256` (`md5` antiguamente) exige el uso de una contraseña. ] #page[ Después de guardar la nueva configuración, hay que indicarle al servicio que la recargue: ```bash $ sudo systemctl reload postgresql ``` En Windows lo debemos hacer desde `psql` directamente. ```bash postgres=# pg_reload_conf(); ``` ] #page[ === Crear una base de datos ```bash $ sudo -u postgres psql postgres=# CREATE DATABASE taller_bokeron; ``` ] #section-page[Conectándose a PostgreSQL] #page[ == DBeaver - https://dbeaver.com/docs/dbeaver/Create-Connection == Python + psycopg2 - https://www.geeksforgeeks.org/python/python-psycopg-connection-class/ ] #section-page[Consideraciones finales] #page[ - Cada sistema tiene pequeñas variaciones en su *dialecto de SQL*, principalmente en las funciones nativas y los tipos. Tenedlas encuenta. - Para el uso en aplicaciones reales, conviene entender a fondo los conceptos de *seguridad* (usuarios, permisos, ...) y el resto de la arquitectura de la aplicación: qué otros controles de acceso existen, cómo se relacionan, etc. - No hemos entrado en la cuestión de las *conexiones remotas*. Hacen falta configuraciones especiales en `pg_hba.conf`. - Aprended *Docker* (y docker-compose). Con ello podréis levantar y tirar bases de datos en cuestión de segundos. ] #page(margin: (top: 20%))[ #show heading: set block(spacing: 0.5em) #set align(top) #heading(outlined:false)[Bases de datos en un contexto FOSS] Una introducción práctica a PostgreSQL #line(length:60%) Miguel Mejía J. (contacto: #link("https://miguelmj.dev/social")[miguelmj.dev/social])#linebreak() 2026 #place(bottom + left)[ #table(columns: (auto,auto), image("assets/image.png", height: 40pt), image("assets/image-2.png", height: 40pt) ) ] #place( bottom+right, link( "https://openbokeron.org/es", image("assets/image-1.png") ) ) #place(bottom + center)[ #set text(size: 0.8em) Diapositivas hechas con Typst ] ]