Как подключиться к postgres при использовании uvicorn.run

Рейтинг: 1Ответов: 1Опубликовано: 20.05.2023

У меня телеграм бот (main.py), работающий на python3 и asyncpg. А так же программа (webhook.py) fastapi uvicorn.run, которая принимает платежи. После этого она выдаёт вип пользователю и записывает данные в БД.

Но у неё проблемы с подключением БД. Хотя тот же файл подключения как и у бота. Условный код webhook.py:

from src.base import db

app = FastAPI()

@app.post('/')
async def webhook(request: Request):
    await db.get()

if __name__ == '__main__':
    uvicorn.run(app, host='127.0.0.1', port=443)

Мне нужно воспользоваться и БД, и функциями в боте, которые так же импортируются, но БД выдаёт ошибку:

asyncpg.exceptions._base.InterfaceError: cannot perform operation: another operation is in progress

или

RuntimeError: Task <Task pending name='Task-55' coro=<_create_ssl_connection() running at /usr/local/lib/python3.10/dist-packages/asyncpg/connect_utils.py:684> cb=[_release_waiter(<Future pendi...ask_wakeup()]>)() at /usr/lib/python3.10/asyncio/tasks.py:387]> got Future <Future pending cb=[_chain_future.._call_check_cancel() at /usr/lib/python3.10/asyncio/futures.py:385]> attached to a different loop

Это происходит независимо от того включён ли основной бот или нет. Как это можно исправить? Ибо всё уже перечитал.

Ответы

▲ 1

Была ошибка в реализации моего подключения:

def __init__(self, **kwargs):
  self.loop = asyncio.get_event_loop()
  self.loop.run_until_complete(self.init(**kwargs))

async def init(self, **kwargs):
  self.pool = await asyncpg.create_pool(**kwargs)

Из-за loop. Сделал init при использования любого метода в первый раз и всё заработало.