Saltar al contenido
Bases de datos con SQL
Todos los cursos Ir al ejercicio →

SQLite y PostgreSQL en la práctica

  • ⏱ 55 minutos
  • 📶 Nivel: principiante
  • 🧩 Incluye ejercicio

💡 🎯 Al terminar esta lección podrás…

  • Explicar las diferencias de arquitectura entre SQLite y PostgreSQL.
  • Usar las terminales sqlite3 y psql.
  • Adaptar el SQL entre los dos motores.
  • Conectar una aplicación de Node.js a cada uno con consultas parametrizadas.

1.Dos motores, dos filosofías

SQL es el lenguaje; SQLite y PostgreSQL son dos programas (motores) que lo entienden. Lo que aprendiste hasta aquí sirve para ambos, con pequeñas diferencias que verás en esta lección.

SQLitePostgreSQL
ArquitecturaUna biblioteca: la base de datos es un solo archivo; no hay servidorCliente-servidor: un servidor que escucha y al que te conectas
InstalaciónCasi nula (viene en muchos sistemas)Hay que instalar y configurar el servidor
Usuarios y permisosNo tiene (los permisos son los del archivo)Roles, contraseñas y permisos por tabla
ConcurrenciaMuchas lecturas; una escritura a la vezMuchos usuarios leyendo y escribiendo a la vez
TiposFlexibles: la columna sugiere el tipo, no lo imponeEstrictos: rechaza un texto en una columna entera
Ideal paraAprender, apps móviles y de escritorio, prototipos y sitios pequeñosAplicaciones web con muchos usuarios y datos importantes

Una buena ruta: aprende y prototipa con SQLite y pasa a PostgreSQL cuando tu aplicación necesite varios usuarios y control de acceso. Como el SQL básico es el mismo, el cambio es pequeño.

2.SQLite en la práctica

Descarga las «command-line tools» desde sqlite.org/download (en macOS ya viene instalado; en Linux, sudo apt install sqlite3). Comprueba la instalación abriendo una terminal:

Abrir o crear una base de datos
sqlite3 tienda.db

Si tienda.db no existe, se crea al guardar algo. Dentro del programa escribes SQL terminado en ; y comandos de punto (sin ;) que controlan el programa:

ComandoPara qué sirve
.helpVer todos los comandos
.tablesListar las tablas
.schema productosVer el CREATE TABLE de una tabla
.headers on y .mode columnMostrar los resultados con encabezados y en columnas
.read tienda.sqlEjecutar un archivo de SQL
.quitSalir

Un flujo de trabajo típico: escribes tu esquema en tienda.sql, lo cargas con .read y consultas. También puedes ejecutar una instrucción sin entrar al programa:

Ejecutar una consulta desde la terminal
sqlite3 -header -column tienda.db "SELECT nombre, precio FROM productos WHERE precio > 100 ORDER BY precio;"

Con los datos de la tienda, esa consulta devuelve:

Resultado esperado

nombreprecio
Teclado120.00
Webcam150.00
Monitor FHD650.00
Monitor 4K899.00

💡 Consejo · Recuerda las claves foráneas

En SQLite, cada vez que abras una conexión debes ejecutar PRAGMA foreign_keys = ON; si quieres que se cumplan (lección 5). En PostgreSQL ya lo están.

3.PostgreSQL en la práctica

Instálalo desde postgresql.org/download (el instalador de Windows incluye psql y un panel gráfico). Durante la instalación elegirás una contraseña para el usuario administrador postgres: guárdala. El servidor se queda funcionando en segundo plano.

Conectarte con psql
psql -U postgres

Igual que SQLite, psql tiene sus propios comandos, que empiezan por una barra invertida:

ComandoPara qué sirve
\lListar las bases de datos
\c tiendaConectarte a la base tienda
\dtListar las tablas
\d productosDescribir una tabla
\i tienda.sqlEjecutar un archivo de SQL
\qSalir

Aquí, además de las tablas, creas la base de datos y un usuario propio para tu aplicación (no uses postgres en tus programas):

Preparar una base para la tienda
CREATE DATABASE tienda;
CREATE ROLE tienda_app LOGIN PASSWORD 'cambia-esta-clave';
GRANT ALL PRIVILEGES ON DATABASE tienda TO tienda_app;

Con la base creada, tu esquema casi no cambia. Lo único que debes adaptar es la sintaxis que ves en la siguiente sección.

4.Diferencias de sintaxis que debes conocer

La mayor parte del SQL es idéntico. Estas son las diferencias que más te encontrarás:

Funciones comunes en SQLite (resultado verificado)
SELECT 'Teclado' LIKE 'tec%' AS coincide,
       'Mon' || 'itor'      AS junto,
       typeof(1)            AS tipo1,
       typeof('1')          AS tipo2;

Resultado esperado

coincidejuntotipo1tipo2
1Monitorintegertext

LIKE y || funcionan igual en ambos motores, pero en PostgreSQL LIKE distingue mayúsculas y para ignorarlas se usa ILIKE. En el siguiente laboratorio tienes la lista de equivalencias.

Sobre los tipos: SQLite acepta un texto en una columna INTEGER y lo guarda tal cual:

Tipado flexible de SQLite
CREATE TABLE prueba (n INTEGER);
INSERT INTO prueba VALUES ('hola');
SELECT n, typeof(n) AS tipo FROM prueba;

Resultado esperado

ntipo
holatext

PostgreSQL rechazaría esa inserción con invalid input syntax for type integer: "hola". Es una ventaja: los errores se detectan al guardar, no meses después.

5.Pruébalo: traductor de SQLite a PostgreSQL

Elige una tarea y mira cómo se escribe en cada motor. Úsalo como chuleta cuando cambies de uno a otro.

🔄 Traductor de dialectos

SQLite


    

PostgreSQL


  

6.Conectar desde Node.js

Tu aplicación se conecta a la base de datos con una biblioteca. El patrón es el mismo en ambos motores: abrir la conexión, enviar la consulta con parámetros (nunca pegando valores en el texto; lo verás en la lección 8) y recibir un arreglo de filas. Los ejemplos usan módulos ES ("type": "module" en tu package.json).

SQLite con better-sqlite3 (npm install better-sqlite3). Es síncrono y muy simple:

sqlite.js
import Database from 'better-sqlite3';

const db = new Database('tienda.db');
db.pragma('foreign_keys = ON');

const minimo = 100;
const filas = db.prepare('SELECT nombre, precio FROM productos WHERE precio > ?').all(minimo);
console.log(filas);

PostgreSQL con pg (npm install pg). Es asíncrono y usa un pool de conexiones:

postgres.js
import pg from 'pg';

const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL });

const minimo = 100;
const { rows } = await pool.query(
  'SELECT nombre, precio FROM productos WHERE precio > $1',
  [minimo]
);
console.log(rows);
await pool.end();

La variable DATABASE_URL tiene este aspecto (los datos son ejemplos): postgres://tienda_app:cambia-esta-clave@localhost:5432/tienda. Va en una variable de entorno o en un archivo .env que no se sube a Git.

⚠️ Importante · Los marcadores cambian

SQLite usa ? como marcador de parámetro; PostgreSQL usa $1, $2… Es otra diferencia que debes recordar al mover código de un motor a otro.

7.Errores frecuentes

📒 Apuntes para llevar

  • SQLite es un archivo sin servidor, perfecto para aprender y prototipar; PostgreSQL es un servidor para aplicaciones con muchos usuarios.
  • Mismo SQL en lo esencial; cambian los identificadores automáticos, ILIKE, funciones de fecha y el tipado (flexible frente a estricto).
  • SQLite: sqlite3 tienda.db, .tables, .schema, .read, .quit.
  • PostgreSQL: psql -U postgres, \l, \c, \dt, \d, \i, \q.
  • En PostgreSQL crea una base y un rol propio para tu app; no uses el administrador.
  • En Node.js: better-sqlite3 (parámetros ?) y pg (parámetros $1).
  • Guarda la cadena de conexión en una variable de entorno, no en el código.

8.Glosario

TérminoSignificado
Motor de base de datosPrograma que guarda los datos y ejecuta las consultas SQL (SQLite, PostgreSQL, MySQL…).
Cliente-servidorArquitectura en la que un servidor atiende las peticiones de varios clientes que se conectan a él.
psqlTerminal interactiva de PostgreSQL.
Comando de puntoOrden propia del programa sqlite3 que empieza con . y no es SQL.
RolUsuario o grupo de PostgreSQL con permisos propios.
Cadena de conexiónTexto con usuario, clave, servidor, puerto y base a la que conectarse.
Pool de conexionesConjunto de conexiones abiertas que se reutilizan entre consultas.
Tipado estrictoCuando el motor rechaza valores que no corresponden al tipo de la columna.

🧠 Comprueba lo aprendido

Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.

¿Dónde guarda SQLite una base de datos?

¿Cuál de estos es un motor cliente-servidor?

¿Qué comando de psql lista las tablas?

¿Cómo se escribe un marcador de parámetro en el paquete pg de Node.js?

¿Dónde conviene guardar la contraseña de la base de datos de tu aplicación?

Tu progreso se guarda en este navegador y se refleja en el índice del curso.

💡 🚀 ¡Ahora te toca!

La práctica fija lo aprendido. Pasa al ejercicio de esta lección.

Ir al ejercicio