LogoLupe

Integración con bases de datos

Bases de datos soportadas

Lupe soporta la integración con múltiples bases de datos, permitiéndote elegir la que mejor se adapte a tus necesidades. A continuación, encontrarás guías detalladas para cada una de ellas.

MongoDB

Base de datos NoSQL flexible y escalable

Configuración inicial

  1. Instala mongoose: npm install mongoose
  2. Crea una cuenta en MongoDB Atlas
  3. Obtén tu string de conexión

Conexión

// config/database.js
import mongoose from 'mongoose'

const connectDB = async () => {
  try {
    await mongoose.connect(process.env.MONGODB_URI)
    console.log('MongoDB conectado')
  } catch (error) {
    console.error('Error conectando a MongoDB:', error)
    process.exit(1)
  }
}

export default connectDB

Modelo

// models/User.js
import mongoose from 'mongoose'

const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  email: { type: String, required: true, unique: true },
  password: { type: String, required: true },
  createdAt: { type: Date, default: Date.now }
})

export const User = mongoose.models.User || mongoose.model('User', userSchema)

Uso

// pages/api/users.js
import { User } from '@/models/User'

export async function GET(req) {
  try {
    const users = await User.find({})
    return Response.json({ users })
  } catch (error) {
    return Response.json({ error: error.message }, { status: 500 })
  }
}

Supabase

Alternativa open source a Firebase con PostgreSQL

Configuración inicial

  1. Instala el cliente: npm install @supabase/supabase-js
  2. Crea un proyecto en Supabase
  3. Obtén tus credenciales de proyecto

Conexión

// lib/supabase.js
import { createClient } from '@supabase/supabase-js'

const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL
const supabaseKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY

export const supabase = createClient(supabaseUrl, supabaseKey)

Modelo

// No necesitas definir modelos explícitamente en Supabase
// Ejemplo de estructura de tabla:
/*
  create table users (
    id uuid default uuid_generate_v4() primary key,
    name text not null,
    email text unique not null,
    created_at timestamp with time zone default timezone('utc'::text, now())
  );
*/

Uso

// components/UserList.jsx
import { supabase } from '@/lib/supabase'

export async function getUsers() {
  try {
    const { data, error } = await supabase
      .from('users')
      .select('*')
    
    if (error) throw error
    return data
  } catch (error) {
    console.error('Error:', error)
    return null
  }
}

Convex

Base de datos reactiva para aplicaciones web modernas

Configuración inicial

  1. Instala Convex: npm install convex
  2. Inicializa Convex: npx convex dev
  3. Configura tus credenciales

Conexión

// convex/_generated/api.js
import { ConvexProvider, ConvexReactClient } from 'convex/react'

const convex = new ConvexReactClient(process.env.NEXT_PUBLIC_CONVEX_URL)

export function ConvexClientProvider({ children }) {
  return (
    <ConvexProvider client={convex}>
      {children}
    </ConvexProvider>
  )
}

Modelo

// convex/schema.ts
import { defineSchema, defineTable } from 'convex/server'
import { v } from 'convex/values'

export default defineSchema({
  users: defineTable({
    name: v.string(),
    email: v.string(),
    createdAt: v.number()
  })
})

Uso

// convex/users.js
import { query, mutation } from './_generated/server'

export const getUsers = query(async ({ db }) => {
  return await db.query('users').collect()
})

export const createUser = mutation(async ({ db }, { name, email }) => {
  await db.insert('users', {
    name,
    email,
    createdAt: Date.now()
  })
})

MySQL

Base de datos relacional popular y robusta

Configuración inicial

  1. Instala mysql2: npm install mysql2
  2. Configura un servidor MySQL
  3. Crea una base de datos y usuario

Conexión

// lib/mysql.js
import mysql from 'mysql2/promise'

export async function query({ query, values = [] }) {
  const connection = await mysql.createConnection({
    host: process.env.MYSQL_HOST,
    database: process.env.MYSQL_DATABASE,
    user: process.env.MYSQL_USER,
    password: process.env.MYSQL_PASSWORD
  })

  try {
    const [results] = await connection.execute(query, values)
    connection.end()
    return results
  } catch (error) {
    throw Error(error.message)
    return null
  }
}

Modelo

-- schema.sql
CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  email VARCHAR(255) UNIQUE NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Uso

// pages/api/users.js
import { query } from '@/lib/mysql'

export async function GET(req) {
  try {
    const users = await query({
      query: 'SELECT * FROM users'
    })
    return Response.json({ users })
  } catch (error) {
    return Response.json({ error: error.message }, { status: 500 })
  }
}

Prisma

ORM moderno para Node.js y TypeScript

Configuración inicial

  1. Instala Prisma: npm install prisma @prisma/client
  2. Inicializa Prisma: npx prisma init
  3. Define tu schema y genera el cliente

Conexión

// lib/prisma.js
import { PrismaClient } from '@prisma/client'

const globalForPrisma = global as unknown as { prisma: PrismaClient }

export const prisma = globalForPrisma.prisma || new PrismaClient()

if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma

Modelo

// prisma/schema.prisma
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id        Int      @id @default(autoincrement())
  name      String
  email     String   @unique
  createdAt DateTime @default(now())
}

Uso

// pages/api/users.js
import { prisma } from '@/lib/prisma'

export async function GET(req) {
  try {
    const users = await prisma.user.findMany()
    return Response.json({ users })
  } catch (error) {
    return Response.json({ error: error.message }, { status: 500 })
  }
}

Mejores prácticas

Seguridad

  • Nunca expongas credenciales de base de datos en el código
  • Usa variables de entorno para las credenciales
  • Implementa autenticación y autorización
  • Valida y sanitiza los datos de entrada

Rendimiento

  • Usa índices apropiadamente
  • Implementa caché cuando sea posible
  • Optimiza tus consultas
  • Utiliza conexiones pooling

Mantenibilidad

  • Usa migraciones para cambios en el schema
  • Mantén un registro de cambios
  • Documenta tus modelos y relaciones
  • Sigue patrones de diseño consistentes

Variables de entorno

Ejemplo de archivo .env para diferentes bases de datos:

# MongoDB
MONGODB_URI=mongodb+srv://usuario:contraseña@cluster.mongodb.net/database

# Supabase
NEXT_PUBLIC_SUPABASE_URL=https://tu-proyecto.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=tu-clave-anon-publica

# Convex
NEXT_PUBLIC_CONVEX_URL=https://tu-deployment.convex.cloud

# MySQL
MYSQL_HOST=localhost
MYSQL_DATABASE=tu_database
MYSQL_USER=tu_usuario
MYSQL_PASSWORD=tu_contraseña

# Prisma
DATABASE_URL="postgresql://usuario:contraseña@localhost:5432/database"