Base de datosSQLiteMongoDB7 min de lectura

Conectar base de datos al bot

Integrar SQLite, MongoDB o PostgreSQL con tu bot para almacenar datos de usuarios y configuraciones.


¿Por qué usar una base de datos?

Sin persistencia, tu bot pierde toda la información al reiniciarse. Una base de datos te permite guardar configuraciones por servidor, datos de usuarios, sistemas de economía, warns y más.

Opción 1: SQLite con better-sqlite3

Ideal para bots pequeños/medianos. No requiere servidor externo.

bash
npm install better-sqlite3
javascript
const Database = require('better-sqlite3');
const db = new Database('bot.db');

// Crear tablas
db.exec(`
  CREATE TABLE IF NOT EXISTS guild_config (
    guild_id TEXT PRIMARY KEY,
    prefix TEXT DEFAULT '!',
    welcome_channel TEXT,
    log_channel TEXT
  );

  CREATE TABLE IF NOT EXISTS warnings (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    guild_id TEXT NOT NULL,
    user_id TEXT NOT NULL,
    moderator_id TEXT NOT NULL,
    reason TEXT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
  );
`);

// Funciones helper
function getGuildConfig(guildId) {
  const stmt = db.prepare('SELECT * FROM guild_config WHERE guild_id = ?');
  return stmt.get(guildId) || { guild_id: guildId, prefix: '!' };
}

function setPrefix(guildId, prefix) {
  const stmt = db.prepare(`
    INSERT INTO guild_config (guild_id, prefix)
    VALUES (?, ?)
    ON CONFLICT(guild_id) DO UPDATE SET prefix = ?
  `);
  stmt.run(guildId, prefix, prefix);
}

Opción 2: MongoDB con Mongoose

Ideal para datos no estructurados y bots grandes.

bash
npm install mongoose
javascript
const mongoose = require('mongoose');

await mongoose.connect(process.env.MONGODB_URI);

const guildSchema = new mongoose.Schema({
  guildId: { type: String, required: true, unique: true },
  prefix: { type: String, default: '!' },
  welcomeChannel: String,
  autoRoles: [String],
  settings: {
    antiSpam: { type: Boolean, default: false },
    logChannel: String
  }
});

const Guild = mongoose.model('Guild', guildSchema);

// Uso
async function getOrCreateGuild(guildId) {
  let guild = await Guild.findOne({ guildId });
  if (!guild) {
    guild = await Guild.create({ guildId });
  }
  return guild;
}

Opción 3: PostgreSQL con Prisma

Ideal para datos relacionales complejos y bots enterprise.

bash
npm install prisma @prisma/client
npx prisma init

Definí el schema en prisma/schema.prisma:

prisma
model GuildConfig {
  guildId        String   @id
  prefix         String   @default("!")
  welcomeChannel String?
  warnings       Warning[]
}

model Warning {
  id          Int         @id @default(autoincrement())
  guildId     String
  userId      String
  moderatorId String
  reason      String?
  createdAt   DateTime    @default(now())
  guild       GuildConfig @relation(fields: [guildId], references: [guildId])
}
bash
npx prisma migrate dev --name init

Patrón recomendado: Cache + DB

javascript
const cache = new Map();

async function getConfig(guildId) {
  if (cache.has(guildId)) return cache.get(guildId);
  const config = await db.getGuildConfig(guildId);
  cache.set(guildId, config);
  return config;
}

Recomendaciones

  • SQLite para bots en un solo servidor o con pocos datos
  • MongoDB si los datos son flexibles y cambian de estructura
  • PostgreSQL para relaciones complejas y consultas avanzadas
  • Siempre usá un cache en memoria para datos frecuentes
  • Hacé backups regulares de la base de datos

¿Te resultó útil esta guía?