--- type: Resumen title: "Estudio — PostgreSQL (SQL + Python)" description: "Estudio de postgresql publicado como sitio: scripts minimalistas para implementarlo y cómo se conecta con el OKF." resource: "https://gerardoesquivia.com/postgresql/" status: publicado tags: [estudio, postgresql, scripts-minimalistas, documentacion, okf] timestamp: 2026-10-04 creator: "Gerardo Esquivia Zapata" grafo: datos --- # Estudio — PostgreSQL (SQL + Python) > **Sitio publicado:** https://gerardoesquivia.com/postgresql/ > **Nota generada del sitio** para que el estudio regrese al OKF (REGLA del ciclo: > la documentación no está completa hasta estar publicada **Y** registrada). ## Cómo usarla Los **scripts minimalistas** de abajo se copian y funcionan. Esa es la parte que vale: la prosa se lee y se olvida; un script se pega y arranca. --- ## 1 · psql + SQL básico Conectar, crear una tabla e insertar/consultar. ### 🐘 Script minimalista ``` # Conectar por terminal psql -h localhost -U usuario -d mi_base # SQL: crear tabla + insertar + consultar CREATE TABLE usuarios ( id SERIAL PRIMARY KEY, nombre TEXT NOT NULL, email TEXT UNIQUE ); INSERT INTO usuarios (nombre, email) VALUES ('Ana', 'ana@correo.com'); SELECT * FROM usuarios; ``` ### 🔁 Cómo funciona - psql abre un cliente interactivo contra el servidor. - CREATE TABLE define el esquema; SERIAL autoincrementa el id. - INSERT / SELECT escriben y leen filas. 💡 \d tabla describe la tabla; CREATE INDEX acelera las búsquedas. ## 2 · PostgreSQL desde Python (psycopg) La conexión más corta para ejecutar SQL desde tu código. ### 🐍 Script minimalista ``` # pip install psycopg[binary] import psycopg with psycopg.connect("dbname=mi_base user=usuario host=localhost") as conn: with conn.cursor() as cur: cur.execute("SELECT * FROM usuarios") for row in cur.fetchall(): print(row) ``` ### 🔑 Conceptos clave | Concepto | Qué es | | --- | --- | | psycopg.connect(dsn) | Conexión (gestor de contexto = commit/close automático) | | conn.cursor() | Ejecuta SQL y obtiene resultados | | cur.fetchall() | Devuelve las filas | ## 3 · Grafo animado — el flujo de una consulta El token 🟠 recorre el flujo. Clic en el gráfico reinicia la animación. Iniciando… ## 4 · Referencia y regla de librerías | Función / comando | Qué hace | | --- | --- | | psql -h host -U user -d db | Conectar por terminal | | CREATE TABLE / INSERT / SELECT | DDL + DML básico | | SERIAL · TEXT · INTEGER · JSONB | Tipos y autoincremento | | CREATE INDEX · pg_dump | Rendimiento y respaldo | 📦 Regla de librerías (local primero): revisar C:\Users\TUF\Documents\librerías\local\. Instalación: pip install psycopg[binary]. Docs: https://www.postgresql.org/docs/. 📱 Escanéalo para abrir la documentación https://gerardoesquivia.com/postgresql/ PostgreSQL · Documentación mínima (SQL + Python) · OKF de Gerardo Esquivia Zapata · 2026-08-29 --- type: Resumen title: "🐘 PostgreSQL — Base de datos relacional (Resumen minimalista)" description: "Resumen minimalista de PostgreSQL: psql + SQL y Python/psycopg, con scripts listos para implementar." fuente: "https://www.postgresql.org/docs/" sitio: "https://gerardoesquivia.com/postgresql/" tags: [resumen, postgresql, sql, bases-datos, okf] timestamp: 2026-08-29 creator: "Gerardo Esquivia Zapata" --- # 🐘 PostgreSQL — Resumen (para OKF) > **Para qué:** guardar y consultar datos relacionales (ACID, JSONB) en un RDBMS open source. > **Cómo:** conectar con `psql -h host -U user -d db`; `CREATE TABLE` / `INSERT` / `SELECT`; desde Python con `psycopg`. ## 🛠️ Scripts minimalistas ```bash psql -h localhost -U usuario -d mi_base ``` ```sql CREATE TABLE usuarios (id SERIAL PRIMARY KEY, nombre TEXT NOT NULL, email TEXT UNIQUE); INSERT INTO usuarios (nombre, email) VALUES ('Ana', 'ana@correo.com'); SELECT * FROM usuarios; ``` ```python # pip install psycopg[binary] import psycopg with psycopg.connect("dbname=mi_base user=usuario host=localhost") as conn: with conn.cursor() as cur: cur.execute("SELECT * FROM usuarios") print(cur.fetchall()) ``` ## 🔑 Conceptos clave | Concepto | Qué es | |---|---| | `psql` | Cliente por terminal (`\d` describe tablas) | | `SERIAL` · `TEXT` · `JSONB` | Autoincremento y tipos | | `CREATE INDEX` · `pg_dump` | Rendimiento y respaldo | | `psycopg` | Driver Python recomendado | ## 🔗 Fuente https://www.postgresql.org/docs/ · Sitio: https://gerardoesquivia.com/postgresql/ ## 📥 Cómo agregar esto a tu OKF (para el agente) 1. Guarda este archivo en tu vault (ej. `📋 Proyectos/`). 2. El frontmatter ya es OKF: no modifiques `type` ni `creator`. 3. Implementa directo: copia los scripts y ajusta credenciales/nombres. No necesitas investigar más. function descargarMD(){const md=document.getElementById('md-resumen').textContent.trim();const b=new Blob([md],{type:'text/markdown;charset=utf-8'});const u=URL.createObjectURL(b);const a=document.createElement('a');a.href=u;a.download='resumen-postgresql.md';document.body.appendChild(a);a.click();a.remove();URL.revokeObjectURL(u);} (function(){const nodes=[{id:"cli",label:"psql / Python",sub:"cliente",x:120,y:210},{id:"srv",label:"Servidor PG",sub:"postgres",x:390,y:210},{id:"tbl",label:"Tabla",sub:"usuarios",x:640,y:210},{id:"res",label:"Resultado",sub:"filas",x:860,y:210}];const edges=[{from:"cli",to:"srv",label:"conexión"},{from:"srv",to:"tbl",label:"SQL"},{from:"tbl",to:"srv",label:"filas"},{from:"srv",to:"res",label:"respuesta"},{from:"res",to:"cli",label:"fetchall"}];const pos=Object.fromEntries(nodes.map(n=>[n.id,{x:n.x,y:n.y}]));const svg=document.getElementById("grafo");const NS="http://www.w3.org/2000/svg";function el(t,a){const e=document.createElementNS(NS,t);for(const k in a)e.setAttribute(k,a[k]);return e;}const edgePaths=[],edgeArrows=[]; edges.forEach((ed)=>{const a=pos[ed.from],b=pos[ed.to];let d,mid;if(ed.from==="res"){d=`M ${a.x} ${a.y} C ${(a.x+b.x)/2} 400, ${(a.x+b.x)/2} 400, ${b.x} ${b.y}`;mid={x:(a.x+b.x)/2,y:380};}else{const mx=(a.x+b.x)/2;d=`M ${a.x} ${a.y} C ${mx} ${a.y}, ${mx} ${b.y}, ${b.x} ${b.y}`;mid={x:mx,y:(a.y+b.y)/2};}const p=el("path",{class:"edge",d});svg.appendChild(p);edgePaths.push(p);const ang=Math.atan2(b.y-mid.y,b.x-mid.x);const tx=b.x-18*Math.cos(ang),ty=b.y-18*Math.sin(ang);const ar=el("path",{class:"arrow",d:`M ${tx} ${ty} l 8 -4 l -8 -4 z`,transform:`rotate(${ang*180/Math.PI} ${tx} ${ty})`});svg.appendChild(ar);edgeArrows.push(ar);}); const nodeGroups={};nodes.forEach(n=>{const g=el("g",{class:"node"});g.appendChild(el("rect",{x:n.x-85,y:n.y-29,width:170,height:58}));const t=el("text",{class:"t",x:n.x,y:n.y-4,"text-anchor":"middle"});t.textContent=n.label;const s=el("text",{class:"s",x:n.x,y:n.y+16,"text-anchor":"middle"});s.textContent=n.sub;g.appendChild(t);g.appendChild(s);svg.appendChild(g);nodeGroups[n.id]=g;}); const travel=el("circle",{class:"travel",r:6,opacity:0});svg.appendChild(travel);const caption=document.getElementById("caption");const N=edges.length;let i=0,raf=null; function clearActive(){nodes.forEach(n=>nodeGroups[n.id].classList.remove("active"));edgePaths.forEach(p=>p.classList.remove("active"));edgeArrows.forEach(a=>a.classList.remove("active"));} function animateEdge(idx){const ed=edges[idx];clearActive();edgePaths[idx].classList.add("active");edgeArrows[idx].classList.add("active");nodeGroups[ed.from].classList.add("active");caption.innerHTML=`Paso ${idx+1}/${N}: ${ed.from} → ${ed.to} (${ed.label})`;const path=edgePaths[idx],len=path.getTotalLength();const t0=performance.now(),dur=800;function step(now){let p=(now-t0)/dur;if(p>1)p=1;const pt=path.getPointAtLength(p*len);travel.setAttribute("cx",pt.x);travel.setAttribute("cy",pt.y);travel.setAttribute("opacity",1);if(panimateEdge(i),300);}}raf=requestAnimationFrame(step);} function start(){cancelAnimationFrame(raf);i=0;animateEdge(0);}svg.addEventListener("click",start);start(); })(); --- ## Cómo se conecta con el OKF - **Sitio:** https://gerardoesquivia.com/postgresql/ - **Nota:** esta (bajada del sitio, para consulta del agente) - **Fuente:** https://gerardoesquivia.com/postgresql/ ## Aprendizajes - Los scripts minimalistas son el activo: **el ejemplo más corto que demuestra el uso**. - Este estudio forma parte del ciclo: **estudiar → publicar → registrar en el OKF**.