Дискорд бот (BunkerBot)
Хочу сделать бота в дискорде на подобии игры\фильма бункер, и у меня проблема с sqlite3 Код:
import discord
from discord.ext import commands
import random
import sqlite3
intents = discord.Intents.default()
intents.message_content = True
PREFIX = '.'
bot = commands.Bot(command_prefix=PREFIX, intents = discord.Intents.all())
connecting = sqlite3.connect('server.db')
cursor = connecting.cursor()
@bot.event
async def on_ready():
cursor.execute("""CREATE TABLE IF NOT EXISTS users (
fobia TEXT,
id INT
)""")
for guild in bot.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.id}', 'none')")
else:
pass
connecting.commit()
print('BOT CONNECT')
@bot.event
async def on_member_join(member):
for guild in bot.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.id}', 'none')")
connecting.commit()
else:
pass
@bot.command()
async def b(ctx, member: discord.Member):
fobia = ['Ятрофобия ||боязнь врачей||', 'Эргофобия ||боязнь работать, совершать какие-либо действия||','Эйхофобия ||боязнь произносить или выслушивать добрые пожелания||', 'Уранофобия ||боязнь смотреть в небо||']
fobia1 = random.choice(fobia)
cursor.execute("UPDATE users SET fobia = {} WHERE id = {}".format(fobia1, member.id))
connecting.commit()
embed = discord.Embed(description=f'**--------------------------------ИНФОРМАЦИЯ---------------------------------**\n'
f"""**Фобия/Страх - {cursor.execute("SELECT charapter FROM users WHERE id {}".format(member.id)).fetchone()[0]}.**\n""",color=discord.Color.dark_blue())
await member.send(embed=embed)
bot.run('TOKEN')
Проблема в том что у меня идёт какая-то фобия например (Ятрофобия) и после слова боязнь идёт ошибка. Ошибка:
File "C:\pythonProject1\.venv\Lib\site-packages\discord\ext\commands\core.py", line 235, in wrapped
ret = await coro(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\pythonProject1\DiscordBot.py", line 133, in b
cursor.execute("UPDATE users SET fobia = {} WHERE id = {}".format(fobia1, member.id))
sqlite3.OperationalError: near "ядов": syntax error
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\pythonProject1\.venv\Lib\site-packages\discord\ext\commands\bot.py", line 1350, in invoke
await ctx.command.invoke(ctx)
File "C:\pythonProject1\.venv\Lib\site-packages\discord\ext\commands\core.py", line 1029, in invoke
await injected(*ctx.args, **ctx.kwargs) # type: ignore
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\pythonProject1\.venv\Lib\site-packages\discord\ext\commands\core.py", line 244, in wrapped
raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: OperationalError: near "ядов": syntax error```
Ответы (2 шт):
Автор решения: BArbosspirat
→ Ссылка
я думаю, что проблема в том, что нет кавычек у fobia1.
cursor.execute("UPDATE users SET fobia = ? WHERE id = ?", [fobia1,member.id])
можно сделать так. Также вы можете так и использовать f строки.
cursor.execute(f"UPDATE users SET fobia = '{fobia1}' WHERE id = {member.id}")
Немного дополню f строки не безопасны, так что лучше использовать первый вариант. f строки могут привести к SQL injection.
Автор решения: Syirezz
→ Ссылка
Для передачи значений в запрос SQL, вместо использования .format(). В вашем случае, вы можете передать значения напрямую в кортеже после запроса, как показано ниже:
cursor.execute("UPDATE users SET fobia = ? WHERE id = ?", (fobia1, member.id))