Trabajo con bases de datos en TypeScript: PostgreSQL y MongoDB
TypeScript es un potente lenguaje de programación que añade tipado estático a JavaScript. En el desarrollo de aplicaciones web modernas, el trabajo con bases de datos es una parte esencial. En este artículo, veremos cómo trabajar eficazmente con dos bases de datos populares — la relacional PostgreSQL y la orientada a documentos MongoDB — utilizando TypeScript.
1. Preparación del entorno y elección del ORM
Antes de comenzar, es necesario configurar el proyecto. Cree un nuevo proyecto Node.js con soporte para TypeScript:
mkdir ts-database-democd ts-database-demonpm init -ynpm install typescript @types/node ts-node --save-devnpx tsc --initPara trabajar con bases de datos utilizaremos bibliotecas populares:
- Prisma — un ORM moderno para PostgreSQL (y otras bases SQL)
- Mongoose — un ODM para MongoDB con excelente soporte para TypeScript
Instale los paquetes necesarios:
npm install prisma @prisma/client mongoosenpm install @types/mongoose --save-dev2. Trabajo con PostgreSQL a través de Prisma
Prisma es un ORM que genera automáticamente tipos de TypeScript basados en el esquema de su base de datos. Esto garantiza una seguridad de tipos completa.
2.1. Configuración de Prisma
Inicialice Prisma en el proyecto:
npx prisma initEn el archivo prisma/schema.prisma defina el modelo de datos:
generator client { provider = "prisma-client-js"}
datasource db { provider = "postgresql" url = env("DATABASE_URL")}
model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt}
model Post { id Int @id @default(autoincrement()) title String content String? published Boolean @default(false) author User @relation(fields: [authorId], references: [id]) authorId Int createdAt DateTime @default(now()) updatedAt DateTime @updatedAt}Cree un archivo .env con la cadena de conexión:
DATABASE_URL="postgresql://user:password@localhost:5432/mydb"Ejecute la migración:
npx prisma migrate dev --name init2.2. Operaciones CRUD con TypeScript
Ahora escribamos código tipado para trabajar con la base de datos. Cree un archivo src/postgres.ts:
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
interface CreateUserInput { email: string; name?: string;}
interface CreatePostInput { title: string; content?: string; authorId: number;}
// Creación de usuarioasync function createUser(data: CreateUserInput) { return await prisma.user.create({ data: { email: data.email, name: data.name, }, });}
// Obtención de todos los usuarios con sus publicacionesasync function getUsersWithPosts() { return await prisma.user.findMany({ include: { posts: true, }, });}
// Creación de publicaciónasync function createPost(data: CreatePostInput) { return await prisma.post.create({ data: { title: data.title, content: data.content, authorId: data.authorId, }, });}
// Actualización de usuarioasync function updateUser(id: number, data: Partial<CreateUserInput>) { return await prisma.user.update({ where: { id }, data, });}
// Eliminación de usuarioasync function deleteUser(id: number) { return await prisma.user.delete({ where: { id }, });}
// Ejemplo de uso(async () => { try { const user = await createUser({ email: 'ivan@example.com', n