Introducción al trabajo con bases de datos en TypeScript
TypeScript es una extensión de JavaScript fuertemente tipada que añade tipado estático y características modernas del lenguaje. Al desarrollar aplicaciones backend en TypeScript, a menudo surge la necesidad de interactuar con bases de datos. Dos de las soluciones más populares son el sistema de gestión de bases de datos relacional PostgreSQL y MongoDB, orientada a documentos. En este artículo, veremos cómo trabajar eficazmente con ambas bases de datos en TypeScript, utilizando bibliotecas probadas y mejores prácticas.
Configuración del entorno e instalación de dependencias
Antes de comenzar, asegúrate de tener instalados Node.js y npm. Crea un nuevo proyecto e instala los paquetes necesarios:
mkdir typescript-db-examplecd typescript-db-examplenpm init -ynpm install typescript ts-node @types/node --save-devnpx tsc --initPara trabajar con PostgreSQL usaremos TypeORM, un potente ORM con soporte para TypeScript. Para MongoDB, usaremos Mongoose.
npm install typeorm reflect-metadata pgnpm install mongooseTrabajo con PostgreSQL a través de TypeORM
Configuración de la conexión a PostgreSQL
TypeORM soporta decoradores y active record. Creemos un archivo data-source.ts para la configuración:
import { DataSource } from "typeorm";
export const AppDataSource = new DataSource({ type: "postgres", host: "localhost", port: 5432, username: "your_username", password: "your_password", database: "test_db", synchronize: true, logging: false, entities: ["src/entity/**/*.ts"], migrations: [], subscribers: [],});Creación de una entidad (Entity)
Definamos un modelo de usuario usando decoradores:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column() firstName: string;
@Column() lastName: string;
@Column({ unique: true }) email: string;
@Column({ default: true }) isActive: boolean;}Operaciones CRUD con PostgreSQL
Realicemos las operaciones básicas con la base de datos:
import { AppDataSource } from "./data-source";import { User } from "./entity/User";
async function main() { await AppDataSource.initialize(); const userRepository = AppDataSource.getRepository(User);
// CREATE const newUser = userRepository.create({ firstName: "Iván", lastName: "Petrov", email: "ivan@example.com" }); await userRepository.save(newUser);
// READ const users = await userRepository.find(); console.log("Todos los usuarios:", users);
// UPDATE const userToUpdate = await userRepository.findOneBy({ id: 1 }); if (userToUpdate) { userToUpdate.isActive = false; await userRepository.save(userToUpdate); }
// DELETE await userRepository.delete({ id: 1 });}
main().catch(console.error);Trabajo con MongoDB a través de Mongoose
Conexión a MongoDB
Mongoose proporciona un esquema y validación convenientes para MongoDB. Configuremos la conexión:
import mongoose, { Schema, Document, Model } from "mongoose";
const MONGO_URI = "mongodb://localhost:27017/test";
mongoose.connect(MONGO_URI) .then(() => console.log("Conectado a MongoDB")) .catch(err => console.error("Error de conexión:", err));Definición del esquema y modelo
Creemos una interfaz para TypeScript y un esquema de Mongoose:
// Interfaz para TypeScriptinterface IUser extends Document { firstName: string; lastName: string; email: string; createdAt: Date;}
// Esquema de Mongooseconst userSchema = new Schema({ firstName: { type: String, required: true }, lastName: { type: String, required: true }, email: { type: String, required: true, unique: true }, createdAt: { type: Date, default: Date.now }});
// Modeloexport const UserModel: Model = mongoose.model("User", userSchema);