@kabezajka

Проблема с внесением данных участника сервера discord в базу данных sqlite3, что делать?

Код, я конечно, взял из интернета, поэтому и туплю по этому поводу.
Бот - экономический. Сама проблема в занесении данных о пользователе(ник, айди и т.д.) в базу данных.
Других ошибок нет - если занести вручную участника, то у него всё будет работать.

Мне нужна помощь в том, как сделать, чтобы автоматически заносились данные пользователя в базу данных.
Помогите пожалуйста :(

Вот код:
import discord
from discord.ext import commands

import sqlite3
from config import settings

intents = discord.Intents.default()
intents.members = True

client = commands.Bot(command_prefix = settings['PREFIX'])
client.remove_command('help')

connection = sqlite3.connect('server.db')
cursor = connection.cursor()


@client.event
async def on_ready():
    cursor.execute("""CREATE TABLE IF NOT EXISTS users (
        name TEXT,
        id INT,
        cash BIGINT,
        rep INT,
        lvl INT,
        server_id INT
    )""")

    cursor.execute("""CREATE TABLE IF NOT EXISTS shop(
        role_id INT,
        id INT,
        cost BIGINT
    )""")

    for guild in client.guilds:
        for member in guild.members:
            if cursor.execute(f"SELECT id FROM users WHERE id = {member.id}").fetchone() is None:
                cursor.execute(f"INSERT INTO users VALUES ('{member}', {member.id}, 0, 0, 1, {guild.id})")
                connection.commit()
            else:
                pass
    connection.commit()

print('готов служить на благо Империи')

@client.event
async def on_member_join(member):
    if cursor.execute(f"SELECT id FROM users WHERE id = {member.id}").fetchone() is None:
        cursor.execute(f"INSERT INTO users VALUES ('{member}', {member.id}, 0, 0, 1, {member.guild.id})")
        connection.commit()
    else:
        pass
  • Вопрос задан
  • 48 просмотров
Пригласить эксперта
Ответы на вопрос 1
fenrir1121
@fenrir1121
Python developer
Минимально изучите sql чтобы помощь не была бесполезна и приведите код к приемлемому виду.
Вероятнее всего после исправления и вопрос отпадет.

0. Никогда не используйте f-строки, format() и % в sql запросах. Прочитайте хотя бы базовую документацию sqlite3. Прочитайте про первичный ключ, внешний ключ, значения по-умолчанию. Посмотрите какие есть типы данных и какие у них ограничения. К примеру ваш id не влезет в INT
1. Удалите весь кошмар из on_ready. Никогда не прогоняйте всех пользователей всех серверов. А тем более при каждом запуске. Зачем хранить десятки(сотни, тысячи, миллионы) людей в базе, судя по всему это магазин, вот и добавляйте профиль в момент когда человек начинает им пользоваться
2. Вместо подобной конструкции из if -select - insert используйте INSERT INTO ... ON CONFLICT ... DO UPDATE SET ...

...
99. Больше не копируйте там, откуда вы это скопировали
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы