Top.Mail.Ru
Ответы

Помогите с Постгрес. InterfaceError: cannot perform operation: another operation is in progress

делаю бота тг на питоне. Подключил БД, настроил пул, и вот ошибка.

123456789101112131415161718192021222324252627282930313233343536373839404142434445
 async def create_pool(): 
    pool = await asyncpg.create_pool(user='postgres', password='ZuMaISbest', database='tgbot', host='localhost') 
    async with pool.acquire() as connection: 
        await connection.execute(''' 
            CREATE TABLE IF NOT EXISTS users ( 
                id INTEGER PRIMARY KEY, 
                name TEXT, 
                age TEXT, 
                gender TEXT, 
                preference TEXT, 
                interests TEXT, 
                favorites INTEGER[], 
                media JSONB 
            ) 
        ''') 
    return pool 
 
pool = asyncio.run(create_pool()) 
 
# Команда /start 
@router.message(Command(commands=['start'])) 
async def start(message: types.Message): 
    user_id = message.from_user.id 
    async with pool.acquire() as connection: 
        user = await connection.fetchrow('SELECT * FROM users WHERE id = $1', user_id) 
        if user is not None: 
            await process_message(message) 
        else: 
            await message.answer("Привет! Для начала знакомства пройди регистрацию командой /register") 
    await main_menu(message)
+++++++++++++++++++++++++++++++++++++++++
InterfaceError: cannot perform operation: another operation is in progress 
    await message.answer("Привет! Для начала знакомства пройди регистрацию командой /register") 
  File "C:\Users\Ivan\Desktop\venv\lib\site-packages\asyncpg\pool.py", line 219, in release 
    raise ex 
  File "C:\Users\Ivan\Desktop\venv\lib\site-packages\asyncpg\pool.py", line 209, in release 
    await self._con.reset(timeout=budget) 
  File "C:\Users\Ivan\Desktop\venv\lib\site-packages\asyncpg\connection.py", line 1500, in reset 
    await self.execute(reset_query, timeout=timeout) 
  File "C:\Users\Ivan\Desktop\venv\lib\site-packages\asyncpg\connection.py", line 350, in execute 
    result = await self._protocol.query(query, timeout) 
  File "asyncpg\protocol\protocol.pyx", line 359, in query 
  File "asyncpg\protocol\protocol.pyx", line 744, in asyncpg.protocol.protocol.BaseProtocol._check_state 
asyncpg.exceptions._base.InterfaceError: cannot perform operation: another operation is in progress 
 
По дате
По рейтингу
Аватар пользователя
Мастер

Ошибка InterfaceError: cannot perform operation: another operation is in progress возникает, когда вы пытаетесь выполнить несколько операций одновременно в одном соединении с базой данных. В вашем случае это происходит из-за того, что вы пытаетесь выполнить команду SELECT в блоке async with pool.acquire() as connection: в то время, как другая операция (создание таблицы) все еще выполняется в том же соединении.

Чтобы исправить эту ошибку, необходимо убедиться, что все операции выполняются в одном блоке async with pool.acquire() as connection:. Вот исправленный код:

123456789101112131415161718192021
 async def create_pool():  
    pool = await asyncpg.create_pool(user='postgres', password='ZuMaISbest', database='tgbot', host='localhost')  
    async with pool.acquire() as connection:  
        await connection.execute('''  
            CREATE TABLE IF NOT EXISTS users (  
                id INTEGER PRIMARY KEY,  
                name TEXT,  
                age TEXT,  
                gender TEXT,  
                preference TEXT,  
                interests TEXT,  
                favorites INTEGER[],  
                media JSONB  
            )  
        ''')  
        user = await connection.fetchrow('SELECT * FROM users WHERE id = \$1', user_id)  
        if user is not None:  
            await process_message(message)  
        else:  
            await message.answer("Привет! Для начала знакомства пройди регистрацию командой /register")  
    return pool