@Apelcin123

Как сделать таблицу через sqlite 3?

Я делаю бота экономики и для этого нужна как база даных так и таблица, но почемуто база даных работает а таблица нет, помогите пожалуйста, заранее спасибо
вот код:
db = sqlite3.connect('server.db')
cursor = db.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
    )""")
    db.commit()
    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)")
            else:
                pass
    print('Я зайшов в систему')
    await client.change_presence(status = discord.Status.online, activity = discord.Game ('n.help'))
db.commit()
@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)")
        db.commit()
    else:
        pass

@client.command()
async def balance(ctx, member: discord.Member = None):
    if member is None:
        await ctx.send(embed = discord.Embed(
            description = f"""Баланс учасника **{ctx.author}** є **{cursor.execute("SELECT cash FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[0]} :leaves:**"""
        ))
    else:
        await ctx.send(embed = discord.Embed(
            description = f"""Баланс учасника **{member}** є **{cursor.execute("SELECT cash FROM users WHERE id = {}".format(member.id)).fetchone()[0]} :leaves:**"""
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
@serhiops
Python/JavaScript/C++
Ошибка тут (и даже не одна):
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)")
        db.commit()
    else:
        pass

1. В sqlite можно добавлять только примитивные типы данных : int, str, bool, etc.. А ты пытаешься положить туда экземпляр класса:
cursor.execute(f"INSERT INTO users VALUES ('{member}', {member.id}, 0, 0, 1)")
Ты не можешь положить member, обратись к его атрибутам, как ты это сделал с member.id
2. Я хз где большинство людей смотрят гайды по sqlite, ибо подобные вопросы возникают очень часто, а ошибки одни и теже (возьму тот-же пример):
cursor.execute(f"INSERT INTO users VALUES ('{member}', {member.id}, 0, 0, 1)")
при помощи f-строки или других способов конкатинации строк нельзя строить sqlite-запросы. Вы ,как минимум, не защищаете себя от sql-иньекций. Правильный вариант:
cursor.execute("INSERT INTO users VALUES (?,?,?,?,?)", (member.atribute,member.id,0, 0, 1 ))
3. Такие вопросы задаются очень часто, вот последниц, на который я давал ответ 2 дня назад:
link
4. Саму функцию вы тоже странно написали, зачем блок else?
@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)")
        db.commit()
Этого должно хватить
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы