Eylexander / Project-1B

Learning JS through Discord.js
MIT License
0 stars 0 forks source link

Database line addition #15

Closed Eylexander closed 1 year ago

Eylexander commented 2 years ago

Hey @dannyhpy, avec un début de maitrise des Bases de Données, je me suis dit que je pouvais créer une sorte de Todo list sous forme de tableau. Mais mes compétences ne sont pas forcément à la hauteur et je me retrouve avec quelques chose d'à moitié fonctionnel. Lorsque j'ajoute une première chose, tout marche correctement comme souhaité, mais l'erreur s'effectue au bout de la 2e, le programme crashant lorsqu'il reconnait mon ID.

Voici l'erreur :

C:\Users\Eylexander\Desktop\Projets\Project 1B\commands\DevTools\todo.js:28
            addtodo.run({
                    ^
SqliteError: UNIQUE constraint failed: tool.user
    at Object.module.exports.execute (C:\Users\Eylexander\Desktop\Projets\Project 1B\commands\DevTools\todo.js:28:21)
    at module.exports (C:\Users\Eylexander\Desktop\Projets\Project 1B\events\message.js:20:21)
    at Client.emit (node:events:406:35)
    at MessageCreateAction.handle (C:\Users\Eylexander\Desktop\Projets\Project 1B\node_modules\discord.js\src\client\actions\MessageCreate.js:31:14)
    at Object.module.exports [as MESSAGE_CREATE] (C:\Users\Eylexander\Desktop\Projets\Project 1B\node_modules\discord.js\src\client\websocket\handlers\MESSAGE_CREATE.js:4:32)
    at WebSocketManager.handlePacket (C:\Users\Eylexander\Desktop\Projets\Project 1B\node_modules\discord.js\src\client\websocket\WebSocketManager.js:384:31)
    at WebSocketShard.onPacket (C:\Users\Eylexander\Desktop\Projets\Project 1B\node_modules\discord.js\src\client\websocket\WebSocketShard.js:444:22)
    at WebSocketShard.onMessage (C:\Users\Eylexander\Desktop\Projets\Project 1B\node_modules\discord.js\src\client\websocket\WebSocketShard.js:301:10)
    at WebSocket.onMessage (C:\Users\Eylexander\Desktop\Projets\Project 1B\node_modules\ws\lib\event-target.js:132:16)
    at WebSocket.emit (node:events:394:28)

J'ai aussi essayé d'ajouter un système qui compte le numéro de la tâche, mais sans succès, voici ce qui apparait dans mon tableau : [object Object]1

Localisation du fichier : commands/DevTools/todo.js

Je me doute que ça peut être assez compliqué comme problème et que ma simple organisation de mon tableau peut en être à l'origine. C'est pourquoi je te remerci d'avance pour tout tes efforts visant à m'aider, Merci !

dannyhpy commented 2 years ago

Ta colonne user dans ta table tool est en UNIQUE. Donc il ne peut y avoir qu'une entrée TODO par utilisateur. Il faut modifier ta table

Eylexander commented 2 years ago

Donc je dois modifier cette ligne de commande qui se trouve dans tools/dbUtils.js ?


 ​        ​tool​.​prepare​(​"CREATE UNIQUE INDEX idx_devtool_id ON tool (user);"​)​.​run​(​)​;
dannyhpy commented 2 years ago

Oui, tu devrais retirer la contrainte UNIQUE si tu veux permettre à l'un d'avoir plusieurs éléments dans sa todo-list

Eylexander commented 2 years ago

J'ai essayé de faire ainsi, mais j'ai des résultats concluant seulement en supprimant la ligne d'index. De plus je n'arrive pas à faire en sorte de numéroter chacune de mes additions.

dannyhpy commented 2 years ago

Pourquoi tu voudrais numéroter tes additions ? Si tu souhaites rajouter un ID à chaque tâche de la liste, je te suggère de créer une colonne "auto-incrémentée" pour cela

J'ai essayé de faire ainsi, mais j'ai des résultats concluant seulement en supprimant la ligne d'index

Si tu retires juste le mot-clé UNIQUE, ce n'est pas suffisant :thinking: ?

Eylexander commented 2 years ago

En retirant le mot-clé ça marche sans soucis, ça marche nickel là dessus et je t'en remercie. Mais au niveau de ma colonne numéroté, ça me numérote chaque ligne avec l'option "AUTO_INCREMENT", mais l'idée serait d'avoir une colonne de variable qui elle l'est.

dannyhpy commented 2 years ago

mais l'idée serait d'avoir une colonne de variable qui elle l'est.

Je n'ai pas compris ce que tu voulais dire.

La actuellement, la colonne number est auto-incrémentée de ce que je lis.

Pourquoi vouloir auto-incrémenter number au lieu de id d'ailleurs ?

Eylexander commented 2 years ago

L'idée initiale c'était de pouvoir indexer mes idées pour pouvoir ainsi les supprimer en fonction de leur numéro. Dans une application MySQL c'est parfait mais pas pour une gestion sur Discord.

Eylexander commented 2 years ago

Donc j'ai tout reformaté histoire de faire clean et là j'en suis arrivé à me dire que pour un truc que je restreint rien qu'à moi même en début de commande, je n'ai pas le besoin d'attribuer mon ID sachant que je ne maitrise pas assez SQL. Donc ce que j'ai fait c'est que j'ai restreint à uniquement 2 colonnes : id et todo qui numérote tout ça mais en fonction de Math.random() donc c'est à refaire. Et puis je me demande aussi comment avec du langage SQL je peux lister chaque ligne d'un tableau ?

dannyhpy commented 2 years ago

Chaque ligne? Simplement SELECT * FROM myTable sans condition WHERE ...

Eylexander commented 2 years ago

En soit ce que je recherchais c'était surtout comment renvoyer tout ça sur Discord, mais en soit j'étais déjà mal parti donc merci beaucoup.

Juste, comment je pourrais faire pour nommer mes ID's dans un ordre défini ? Sans que ça reprenne un numéro déjà pris

dannyhpy commented 2 years ago

Tu peux chercher comment utiliser les "AUTO INCREMENT" en fonction de ta base de donnée, la syntaxe est différente selon le serveur que tu utilises il me semble

Eylexander commented 2 years ago

En soit j'utilise pas vraiment de serveur avec better-sqlite3, enfin j'en ai vraiment aucune idée, en soit j'ai essayé de faire un système, mais je crois que c'est perdu d'avance, il n'y a aucune erreur quand je fais ma commande +todo add . . ., c'est juste du blanc, rien dans la console :

            const biggestID = dev.prepare("SELECT * FROM tool ORDER BY id DESC LIMIT 1").all();
            for (const loop of biggestID) {
                const param = args.slice(1)
                addtodo.run({
                    id : (loop.id + Number(1)) == false ? Number(1) : loop.id + Number(1),
                    todo : param.join(' '),
                })
                return message.channel.send('The task was added correctly. :thumbsup:')
            }

Mais je reste bien conscient que mes conditions sont vraiment pas opti, je m'y mettrai un autre jour je pense

Eylexander commented 1 year ago

Finalement avec un peu d'apprentissage et de motivation, j'ai réussi à refaire quelque chose avec un todo qui se crée automatiquement avec la table avec un ID entier. Comme ça j'ai juste à incrémenter celui-ci à chaque fois, même si dans ce contexte cela marche moins bien : ID 1, ID2, ID 3, ID4 -> DELETE de ID 2 -> ID 1, ID3, ID4 -> Ajout d'un nouveau TODO -> ID 1, ID 3, ID4, ID 5