Возможно я вообще не понимаю как работает cursor при работе с бд, но проблема такая. Я делаю discord бота и когда пользователь вводит команду он должен проверять есть ли у него на это права, делая запрос с бд. Для этого я написал функцию has_permissions()
:
def has_permissions(ctx):
def check_users():
print("check_users")
author_id = ctx.author.id
allowed_users = permissions['user_ids']
for i in range(len(allowed_users)):
if allowed_users[i] == author_id:
return True
else:
return False
def check_roles():
print("check_roles")
author_roles = ctx.author.roles
allowed_roles = permissions['user_roles']
for i in range(len(author_roles)):
for ii in range(len(allowed_roles)):
if allowed_roles[ii] == author_roles[i].id:
return True
else:
return False
row = fetchone(f"SELECT `permissions` FROM `guilds_data` WHERE `guild_id` = {str(ctx.message.guild.id)}")['permissions']
permissions = json.loads(row)[ctx.command.name]
if permissions['only_owner']:
if ctx.author.id == ctx.message.guild.owner_id:
return True
else:
return False
elif permissions['only_admins']:
if ctx.message.author.guild_permissions.administrator:
return True
else:
return False
elif check_users() or check_roles():
return True
else:
raise commands.MissingPermissions(permissions)
Запрос в бд делается через функцию fetchone()
:
def fetchone(query):
try:
with connect.cursor() as cursor:
cursor.execute(query)
return cursor.fetchall()[0]
except pymysql.Error as e:
print(e)
finally:
cursor.close()
Проблема заключается в том, что когда я меняю значения в бд через PhpMyAdmin при запущенном боте, то курсор постоянно содержит только те значения, которые были при первом вызове. В моем понимание он должен каждый раз брать актуальные данные. Как это сделать и что у меня не так?
Вот весь код:
import discord
import json
import pymysql
import pymysql.cursors
from discord.ext import commands
from discord.ext.commands import Bot
from discord import File
TOKEN = '(тут типо токен)'
connect = pymysql.connect(host = 'localhost', user = 'FatherBot', password = 'AjeXXp7jvdRX8Bnw', db = 'fatherbot',
charset = 'utf8mb4', cursorclass = pymysql.cursors.DictCursor)
#ПОДКЛЮЧЕНИЕ К БД
def fetchone(query):
try:
with connect.cursor() as cursor:
cursor.execute(query)
return cursor.fetchall()[0]
except pymysql.Error as e:
print(e)
finally:
cursor.close()
#ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ
async def get_prefix(bot, message):
row = fetchone(f"SELECT `settings` FROM `guilds_data` WHERE `guild_id` = {str(message.guild.id)}")['settings']
return json.loads(row)['prefix']
bot = Bot(command_prefix=get_prefix)
def has_permissions(ctx):
def check_users():
print("check_users")
author_id = ctx.author.id
allowed_users = permissions['user_ids']
for i in range(len(allowed_users)):
if allowed_users[i] == author_id:
return True
else:
return False
def check_roles():
print("check_roles")
author_roles = ctx.author.roles
allowed_roles = permissions['user_roles']
for i in range(len(author_roles)):
for ii in range(len(allowed_roles)):
if allowed_roles[ii] == author_roles[i].id:
return True
else:
return False
row = fetchone(f"SELECT `permissions` FROM `guilds_data` WHERE `guild_id` = {str(ctx.message.guild.id)}")['permissions']
permissions = json.loads(row)[ctx.command.name]
if permissions['only_owner']:
if ctx.author.id == ctx.message.guild.owner_id:
return True
else:
return False
elif permissions['only_admins']:
if ctx.message.author.guild_permissions.administrator:
return True
else:
return False
elif check_users() or check_roles():
return True
else:
raise commands.MissingPermissions(permissions)
#СОБЫТИЯ
@bot.event
async def on_ready():
print("FatherBot connected and ready")
@bot.event
async def on_command_error(ctx, error):
if isinstance(error, commands.MissingPermissions):
await ctx.send('У вас недостаточно прав для выполнения данной команды!')
#КОМАНДЫ
@bot.command()
async def kick(ctx, mention, reason=None):
if has_permissions(ctx):
pass
bot.run(TOKEN)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Пытаюсь составить запрос в бд mysqlВ бд есть таблицы label_person (метки) и answers (ответы)
Имеется такая команда в ansible, которая импортирует в базу mysql какие-то таблицыПомогите сделать условие проверки существования таблицы перед...
Программа разработана в visual studio С# она работает с СУБД MySQLКак при помощи Setup Project создать инсталятор который кроме самой программы устанавливал...