Проблема при написании бота для дискорда с использованием бд
Ошибка:
File "C:\Users\User\Desktop\bot\maintest.py", line 55, in on_ready
`cursor.execute("SELECT `ID` FROM `users` WHERE `ID`= {member.id}")#проверка, существует ли участник в БД`
sqlite3.OperationalError: unrecognized token: "{"
Пробовал без "{}", но уже другая ошибка:
sqlite3.OperationalError: no such column: member.id
55 строка:
cursor.execute("SELECT `ID` FROM `users` WHERE `ID`= {member.id}")#проверка, существует ли участник в БД
Полный код:
import discord
import requests
import json
import random
import sqlite3
import tabulate
# ПОДГРУЗКА
from discord.ext import commands
from config import settings
from tabulate import tabulate
from sqlite3 import Error
con = sqlite3.connect('cursedsoul.db')
cursor = con.cursor()
# SQL
# def sql_connection():
# try:
# con = sqlite3.connect('cursedsoul.db')
# return con
# except Error:
# print(Error)
#def sql_table(con):
# cursor.execute("CREATE TABLE users(ID integer PRIMARY KEY, DISCORD text, SOULS integer)")
# con.commit()
#con = sql_connection()
#sql_table(con)
# ТЕЛО
client = discord.Client()
bot = commands.Bot(command_prefix="!")
@client.event
async def on_ready():
print('Бот {0.user} запущен!'.format(client))
for guild in client.guilds:#т.к. бот для одного сервера, то и цикл выводит один сервер
print(guild.id)#вывод id сервера
for member in guild.members:#цикл, обрабатывающий список участников
cursor.execute("SELECT `ID` FROM `users` WHERE `ID`= {member.id}")#проверка, существует ли участник в БД
if cursor.fetchone()==None:#Если не существует
cursor.execute("INSERT INTO `users` (`ID`,`DISCORD`,`SOULS`) VALUES (? ? ?), (member.id, <@member.id>, 0)") #вводит все данные об участнике в БД
else:#если существует
pass
con.commit()#применение изменений в БД
@client.event
async def on_disconnect():
print('Бот {0.user} завершил работу!'.format(client))
async def on_member_join(member):
cursor.execute("SELECT `ID` FROM `users` WHERE `ID`={member.id}")#все также, существует ли участник в БД
if cursor.fetchone()==None:#Если не существует
cursor.execute("INSERT INTO `users` (`ID`,`DISCORD`,`SOULS`) VALUES (? ? ?), ({member.id}, <@{member.id}>, 0)")
else: #Если существует
pass
con.commit()#применение изменений в БД
# СООБЩЕНИЯ
@bot.command()
async def info(ctx): #команда _account (где "_", ваш префикс указаный в начале)
table=[["ID","DISCORD","SOULS"]]
for row in cursor.execute("SELECT `ID`, `DISCORD`, `SOULS` FROM `users` WHERE `ID`= {ctx.author.id}"):
table.append([row[0],row[1],row[2]])
await ctx.send(">\n{tabulate(table)}")
# con.close() Разрываем подключение.
client.run("secret")```
Ответы (1 шт):
Автор решения: Be3y4uu_K0T
→ Ссылка
Для передачи параметров в запрос используйте аргумент parameters для sqlite3.Cursor.execute.
cursor.execute("INSERT INTO users (ID, DISCORD, SOULS) VALUES (?, ?, ?)", (member.id, member.mention, 0))
вместо:
cursor.execute("INSERT INTO `users` (`ID`,`DISCORD`,`SOULS`) VALUES (? ? ?), ({member.id}, <@{member.id}>, 0)")