Как исправить «pymysql.err.ProgrammingError: Cursor closed»?

from aiomysql import Pool, DictCursor
from basa.db import db_pool

class dbsql():
    pool: Pool = db_pool

    async def register(self):
        async with self.pool.acquire() as conn:
            async with conn.cursor() as cur:
                result = await cur.execute("SELECT * FROM profile WHERE uid")
                row = await cur.fetchall()
            if result == 0:
                await cur.execute(f'INSERT INTO profile(uid) VALUES(uid)')
            else:
                return await row


main = dbsql()


Ошибка:
raise ProgrammingError("Cursor closed")
pymysql.err.ProgrammingError: Cursor closed
  • Вопрос задан
  • 326 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
async with conn.cursor() as cur:
По выходу из with курсор будет гарантированно закрыт, независимо от способа выхода. А у тебя дальше идёт
await cur.execute(f'INSERT INTO profile(uid) VALUES(uid)')

Либо внеси эту операцию внутрь with, либо создай под неё новый курсор.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@alexbprofit
Junior SE
from aiomysql import Pool, DictCursor
from basa.db import db_pool

class dbsql():
    pool: Pool = db_pool

    async def register(self):
        async with self.pool.acquire() as conn:
            async with conn.cursor() as cur:
                result = await cur.execute("SELECT * FROM profile WHERE uid")
                row = await cur.fetchall()
                if result == 0:
                    await cur.execute(f'INSERT INTO profile(uid) VALUES(uid)')
                else:
                    return await row


main = dbsql()
Ответ написан
AlexNest
@AlexNest Куратор тега Python
Работаю с Python/Django
Почитайте как работают контекстные менеджеры.
При использовании таковых работать с cur можно только в блоке with
async with conn.cursor() as cur:
                result = await cur.execute("SELECT * FROM profile WHERE uid")
                row = await cur.fetchall()
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы