Cursor не меняет значение pymysql

211
23 апреля 2022, 06:20

Возможно я вообще не понимаю как работает 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)
READ ALSO
MySQL обновить поле в таблице

MySQL обновить поле в таблице

Имеется таблица import_desc с полями sku и description

245
LEFT OUTER JOIN mysql - почему-то не работает запрос

LEFT OUTER JOIN mysql - почему-то не работает запрос

Пытаюсь составить запрос в бд mysqlВ бд есть таблицы label_person (метки) и answers (ответы)

150
Помогите сделать условие проверки существования таблицы перед импортом Ansible

Помогите сделать условие проверки существования таблицы перед импортом Ansible

Имеется такая команда в ansible, которая импортирует в базу mysql какие-то таблицыПомогите сделать условие проверки существования таблицы перед...

91
инсталлятор для программы, работающий с СУБД MySQL

инсталлятор для программы, работающий с СУБД MySQL

Программа разработана в visual studio С# она работает с СУБД MySQLКак при помощи Setup Project создать инсталятор который кроме самой программы устанавливал...

156