Помогите с Постгрес. 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