Я хочу проверить некоторую функцию, которая работает с Asyncpg . Если я запускаю по одному тесту за раз, он работает нормально. Но если я запускаю несколько тестов за раз, все тесты, кроме первого сбоя с ошибкой asyncpg.exceptions._base.interfaceerror: невозможно выполнить операцию: другая операция выполняется .
Тесты:
@pytest.mark.asyncio
async def test_project_connection(superuser_id, project_id):
data = element_data_random(project_id)
element_id = (await resolve_element_create(data=data, user_id=superuser_id))["id"]
project_elements = (await db_projects_element_ids_get([project_id]))[project_id]
assert element_id in project_elements
@pytest.mark.asyncio
async def test_project_does_not_exist(superuser_id):
data = element_data_random(str(uuid.uuid4()))
with pytest.raises(ObjectWithIdDoesNotExistError):
await resolve_element_create(data=data, user_id=superuser_id)
< /code>
Все функции для работы с DB Использование пула выглядят так: < /p>
async def (*args):
pool = await get_pool()
await pool.execute(...) # or fetch/fetchrow/fetchval
< /code>
Как я получаю пул: < /p>
db_pool = None
async def get_pool():
global db_pool
async def init(con):
await con.set_type_codec('jsonb', encoder=ujson.dumps, decoder=ujson.loads, schema='pg_catalog')
await con.set_type_codec('json', encoder=ujson.dumps, decoder=ujson.loads, schema='pg_catalog')
if not db_pool:
dockerfiles_dir = os.path.join(src_dir, 'dockerfiles')
env_path = os.path.join(dockerfiles_dir, 'dev.env')
try:
# When code and DB inside docker containers
host = 'postgres-docker'
socket.gethostbyname(host)
except socket.error:
# When code on localhost, but DB inside docker container
host = 'localhost'
load_dotenv(dotenv_path=env_path)
db_pool = await asyncpg.create_pool(
database=os.getenv("POSTGRES_DBNAME"),
user=os.getenv("POSTGRES_USER"),
password=os.getenv("POSTGRES_PASSWORD"),
host=host,
init=init
)
return db_pool
Насколько я понимаю под капюшоном, Asynspg создает новое соединение и запускает запрос внутри этого соединения, если вы запускаете запрос через пул. Что дает понять, что каждый запрос должен иметь свое собственное соединение. Однако возникает эта ошибка, которая вызвана, когда одно соединение пытается обрабатывать два запроса одновременно
Я хочу проверить некоторую функцию, которая работает с Asyncpg . Если я запускаю по одному тесту за раз, он работает нормально. Но если я запускаю несколько тестов за раз, все тесты, кроме первого сбоя с ошибкой asyncpg.exceptions._base.interfaceerror: невозможно выполнить операцию: другая операция выполняется . Тесты: [code]@pytest.mark.asyncio async def test_project_connection(superuser_id, project_id): data = element_data_random(project_id)
@pytest.mark.asyncio async def test_project_does_not_exist(superuser_id): data = element_data_random(str(uuid.uuid4()))
with pytest.raises(ObjectWithIdDoesNotExistError): await resolve_element_create(data=data, user_id=superuser_id) < /code> Все функции для работы с DB Использование пула выглядят так: < /p> async def (*args): pool = await get_pool()
await pool.execute(...) # or fetch/fetchrow/fetchval < /code> Как я получаю пул: < /p> db_pool = None
if not db_pool: dockerfiles_dir = os.path.join(src_dir, 'dockerfiles') env_path = os.path.join(dockerfiles_dir, 'dev.env')
try: # When code and DB inside docker containers host = 'postgres-docker' socket.gethostbyname(host) except socket.error: # When code on localhost, but DB inside docker container host = 'localhost'
return db_pool [/code] Насколько я понимаю под капюшоном, Asynspg создает новое соединение и запускает запрос внутри этого соединения, если вы запускаете запрос через пул. Что дает понять, что каждый запрос должен иметь свое собственное соединение. Однако возникает эта ошибка, которая вызвана, когда одно соединение пытается обрабатывать два запроса одновременно
Я хочу проверить некоторую функцию, которая работает с Asyncpg . Если я запускаю по одному тесту за раз, он работает нормально. Но если я запускаю несколько тестов за раз, все тесты, кроме первого сбоя с ошибкой...
Я разрабатываю сервер fastapi, используя sqlalchemy и asyncpg для работы с базой данных postgres. Для каждого запроса создается новая сессия (через внедрение зависимостей fastapi, как в документации). Я использовал sqlite+aiosqlite до...