Black Friday: eerste maand gratis per kwartaal · t/m 30 nov Bekijk de pakketten Voorwaarden
Nieuw hier? Probeer een Minecraft-server of Discord-bot 24 uur gratis. Gratis proberen
ServerSparkServerSpark

Kennisbank

Discord-bot met een database (SQLite) en knoppen

Een werkend voorbeeld in discord.js en discord.py: gegevens opslaan in SQLite en gebruikers op knoppen laten klikken.

NVMe-nodesNachtelijke back-upsBinnen minuten online

Bijgewerkt op 25 oktober 2026

Een bot wordt pas echt handig als hij dingen onthoudt (punten, instellingen, waarschuwingen) en gebruikers knoppen geeft om op te klikken. In deze gids bouw je een klein werkend voorbeeld met een SQLite-database en een knop, in JavaScript (discord.js) en in Python (discord.py). SQLite is een database in één bestand: je hebt geen aparte databaseserver nodig.

Wat het voorbeeld doet

Het commando /button toont een knop. Elke klik wordt per gebruiker in de database geteld, en de bot antwoordt met het totaal van die gebruiker. De telling blijft bewaard na een herstart, want hij staat in het bestand data.db. De teksten in de code zijn Engels; pas ze gerust aan.

JavaScript (discord.js)

package.json heeft deze pakketten nodig (ze worden automatisch geïnstalleerd als je bot start):

{
  "dependencies": {
    "discord.js": "^14.16.0",
    "better-sqlite3": "^11.0.0",
    "dotenv": "^16.4.0"
  }
}

index.js:

require('dotenv').config();
const { Client, GatewayIntentBits, Events, ActionRowBuilder, ButtonBuilder, ButtonStyle, MessageFlags } = require('discord.js');
const Database = require('better-sqlite3');

const db = new Database('data.db');
db.prepare('CREATE TABLE IF NOT EXISTS clicks (user_id TEXT PRIMARY KEY, count INTEGER NOT NULL DEFAULT 0)').run();

const client = new Client({ intents: [GatewayIntentBits.Guilds] });

client.once(Events.ClientReady, async (c) => {
  await c.application.commands.create({ name: 'button', description: 'Show a button' });
  console.log(`Logged in as ${c.user.tag}`);
});

client.on(Events.InteractionCreate, async (interaction) => {
  if (interaction.isChatInputCommand() && interaction.commandName === 'button') {
    const row = new ActionRowBuilder().addComponents(
      new ButtonBuilder().setCustomId('click').setLabel('Click me').setStyle(ButtonStyle.Primary));
    await interaction.reply({ content: 'Press the button:', components: [row] });
  }
  if (interaction.isButton() && interaction.customId === 'click') {
    db.prepare('INSERT INTO clicks (user_id, count) VALUES (?, 1) ON CONFLICT(user_id) DO UPDATE SET count = count + 1').run(interaction.user.id);
    const { count } = db.prepare('SELECT count FROM clicks WHERE user_id = ?').get(interaction.user.id);
    await interaction.reply({ content: `You clicked ${count} times.`, flags: MessageFlags.Ephemeral });
  }
});

client.login(process.env.DISCORD_TOKEN);

Python (discord.py)

requirements.txt (SQLite zit standaard in Python):

discord.py
python-dotenv

app.py:

import os
import sqlite3

import discord
from discord import app_commands
from dotenv import load_dotenv

load_dotenv()
db = sqlite3.connect("data.db")
db.execute("CREATE TABLE IF NOT EXISTS clicks (user_id INTEGER PRIMARY KEY, count INTEGER NOT NULL DEFAULT 0)")
db.commit()


class Clicker(discord.ui.View):
    def __init__(self):
        super().__init__(timeout=None)  # the button keeps working, also after a restart

    @discord.ui.button(label="Click me", style=discord.ButtonStyle.primary, custom_id="click")
    async def click(self, interaction: discord.Interaction, button: discord.ui.Button):
        db.execute("INSERT INTO clicks (user_id, count) VALUES (?, 1) "
                   "ON CONFLICT(user_id) DO UPDATE SET count = count + 1", (interaction.user.id,))
        db.commit()
        (count,) = db.execute("SELECT count FROM clicks WHERE user_id = ?", (interaction.user.id,)).fetchone()
        await interaction.response.send_message(f"You clicked {count} times.", ephemeral=True)


class Bot(discord.Client):
    def __init__(self):
        super().__init__(intents=discord.Intents.default())
        self.tree = app_commands.CommandTree(self)

    async def setup_hook(self):
        self.add_view(Clicker())
        await self.tree.sync()


bot = Bot()


@bot.tree.command(description="Show a button")
async def button(interaction: discord.Interaction):
    await interaction.response.send_message("Press the button:", view=Clicker())


bot.run(os.getenv("DISCORD_TOKEN"))

Draaien bij ServerSpark

  1. Zet je token in een .env-bestand: DISCORD_TOKEN=jouw-token-hier. Deel het nooit.
  2. Upload de bestanden onder Bestanden in SparkPanel (of gebruik SFTP).
  3. Controleer onder Instellingen het startbestand: index.js (Node.js) of app.py (Python).
  4. Klik op Starten. Pakketten worden automatisch geïnstalleerd; de console toont Logged in as … of een foutmelding.

Typ /button in je Discord-server. Een nieuw slash-commando kan een minuutje nodig hebben voordat het verschijnt.

Je data.db is een gewoon bestand in de map van je bot. Download het af en toe onder Bestanden als extra kopie, zeker voor grote wijzigingen.

Veelgestelde vragen

Is SQLite genoeg, of heb ik MySQL nodig? Voor de meeste bots (één bot, tot duizenden servers) is SQLite prima en veel eenvoudiger. Een aparte databaseserver heb je pas nodig als meerdere programma's tegelijk naar dezelfde gegevens schrijven.

De knop zegt "Deze interactie is mislukt". De bot antwoordde niet binnen 3 seconden, of hij stond uit. Kijk in de console in SparkPanel of er een foutmelding staat.

Nieuw met bots? Begin met Een Discord-bot maken met JavaScript of in Python, en lees daarna Je Discord-bot 24/7 online.