DiscordJS 数据库没有理想地存储信息
DiscordJS Database Not Storing Information Ideally
我正在尝试让 Discord 机器人创建一个数据库,该数据库基本上是用户地图(每个用户一行,ID、昵称、头像 URL 等列)一个 !getdata 命令。
我已经到了数据库成功获取数据的地步,在本例中是用户名和用户 ID,但它在两列中显示所有唯一值作为长逗号分隔值(即用户名列显示 'user1,user2,user3').
我确定这是设计使然,但我真的很难重组。我想让它从对象映射(client.users 或 message.guild.members)中获取所有数据,但我无法弄清楚。
我现在正在尝试的另一个选项是为每个用户创建一行,然后填写我想要存储的值,但我很快就无处可去。
我是 SQLite 的新手(node/DiscordJS/JS),所以非常感谢任何建议。
Index.js
const Discord = require('discord.js');
const client = new Discord.Client();
const sql = require('sqlite3');
let db = new sql.Database("users.sqlite", (err) => {
if (err) {
console.log('Error connecting to the database', err)
} else {
console.log('Database connected.')
}
})
let token = process.env.CLIENT_TOKEN;
let prefix = process.env.PREFIX ;
client.on('ready', () => {
console.log(`Logged in as ${client.user.tag}!`);
db.run(`CREATE TABLE IF NOT EXISTS users(username TEXT, id TEXT)`);
})
client.on('message', function(message) {
if (!message.content.startsWith(prefix));
const args = message.content.slice(prefix.length).split(/ +/);
const command = args.shift().toLowerCase();
if (command === 'getdata') {
let username = message.guild.members.map(m=>m.user.username);
let userid = message.guild.members.map(m=>m.user.id);
db.run(`INSERT OR REPLACE INTO users(username, id) VALUES(?,?)`, [`${username}`,`${userid}`]);
return message.channel.send(`User database updated.`);
}
});
client.login(token);
如果您对格式或书写方式感到好奇,答案有两个:
- 我是新手
- 这是我将数据库中的值设为 return 非 null
的唯一方法
提前致谢,
首先,欢迎来到本站。
我希望我能在这里有所启发,而不是深入重构您的代码或让您更改任何重大内容。
关于为什么你要存储一个数组而不是单个值,有一件事让我印象深刻。
let username = message.guild.members.map(m=>m.user.username);
let userid = message.guild.members.map(m=>m.user.id);
.map
调用returns一个数组,而不是单个值。
每个发出命令的用户都是消息对象的一部分。如果我没记错的话,你会希望它是这样的...
(简化版)
const { username, id } = message.member.user;
db.run(`INSERT OR REPLACE INTO users(username, id) VALUES(?,?)`, [username, id]);
// ...
User documentation can be found here
编辑:
如果您想在该命令中为所有用户构建数据库,您可以使用批量插入执行类似以下操作...(快速而肮脏)
db.serialize(() => {
db.run('BEGIN TRANSACTION;');
// execute inserts in transaction
for (const m of message.guild.members) {
db.run('INSERT OR REPLACE INTO users(username, id) VALUES(?,?);', [m.user.username, m.user.id]);
}
// commit all inserts :)
db.run('COMMIT;')
});
message.channel.send('User database updated.');
希望这能为您指明正确的方向:)
我正在尝试让 Discord 机器人创建一个数据库,该数据库基本上是用户地图(每个用户一行,ID、昵称、头像 URL 等列)一个 !getdata 命令。
我已经到了数据库成功获取数据的地步,在本例中是用户名和用户 ID,但它在两列中显示所有唯一值作为长逗号分隔值(即用户名列显示 'user1,user2,user3').
我确定这是设计使然,但我真的很难重组。我想让它从对象映射(client.users 或 message.guild.members)中获取所有数据,但我无法弄清楚。
我现在正在尝试的另一个选项是为每个用户创建一行,然后填写我想要存储的值,但我很快就无处可去。
我是 SQLite 的新手(node/DiscordJS/JS),所以非常感谢任何建议。
Index.js
const Discord = require('discord.js');
const client = new Discord.Client();
const sql = require('sqlite3');
let db = new sql.Database("users.sqlite", (err) => {
if (err) {
console.log('Error connecting to the database', err)
} else {
console.log('Database connected.')
}
})
let token = process.env.CLIENT_TOKEN;
let prefix = process.env.PREFIX ;
client.on('ready', () => {
console.log(`Logged in as ${client.user.tag}!`);
db.run(`CREATE TABLE IF NOT EXISTS users(username TEXT, id TEXT)`);
})
client.on('message', function(message) {
if (!message.content.startsWith(prefix));
const args = message.content.slice(prefix.length).split(/ +/);
const command = args.shift().toLowerCase();
if (command === 'getdata') {
let username = message.guild.members.map(m=>m.user.username);
let userid = message.guild.members.map(m=>m.user.id);
db.run(`INSERT OR REPLACE INTO users(username, id) VALUES(?,?)`, [`${username}`,`${userid}`]);
return message.channel.send(`User database updated.`);
}
});
client.login(token);
如果您对格式或书写方式感到好奇,答案有两个:
- 我是新手
- 这是我将数据库中的值设为 return 非 null 的唯一方法
提前致谢,
首先,欢迎来到本站。
我希望我能在这里有所启发,而不是深入重构您的代码或让您更改任何重大内容。
关于为什么你要存储一个数组而不是单个值,有一件事让我印象深刻。
let username = message.guild.members.map(m=>m.user.username);
let userid = message.guild.members.map(m=>m.user.id);
.map
调用returns一个数组,而不是单个值。
每个发出命令的用户都是消息对象的一部分。如果我没记错的话,你会希望它是这样的...
(简化版)
const { username, id } = message.member.user;
db.run(`INSERT OR REPLACE INTO users(username, id) VALUES(?,?)`, [username, id]);
// ...
User documentation can be found here
编辑:
如果您想在该命令中为所有用户构建数据库,您可以使用批量插入执行类似以下操作...(快速而肮脏)
db.serialize(() => {
db.run('BEGIN TRANSACTION;');
// execute inserts in transaction
for (const m of message.guild.members) {
db.run('INSERT OR REPLACE INTO users(username, id) VALUES(?,?);', [m.user.username, m.user.id]);
}
// commit all inserts :)
db.run('COMMIT;')
});
message.channel.send('User database updated.');
希望这能为您指明正确的方向:)