Closed
Description
- asyncpg version: 0.28.0
- PostgreSQL version: 14
- Python version: 3.10
- Platform: OSX
- Do you use pgbouncer?: yes (transactional mode)
- Did you install asyncpg with pip?: yes
Started from sqlalchemy/sqlalchemy#10226.
asyncpg uses prepared statements despite they're disabled.
To reproduce (thanks @zzzeek for the script!):
import asyncpg
import asyncio
import uuid
async def main():
conn = await asyncpg.connect(
user="scott",
password="tiger",
host="127.0.0.1",
database="test",
port=6432,
statement_cache_size=0,
)
pps = await conn.prepare("select 1", name=f'__asyncpg_{uuid.uuid4()}__')
rows = await pps.fetch()
# remove this 'del' and the error goes away
del pps
(await conn.fetchrow(";"))
asyncio.run(main())
Error
Traceback (most recent call last):
File "/user/app/script.py", line 57, in <module>
asyncio.run(main())
File "/user/.pyenv/versions/3.10.3/lib/python3.10/asyncio/runners.py", line 44, in run
return loop.run_until_complete(main)
File "/user/.pyenv/versions/3.10.3/lib/python3.10/asyncio/base_events.py", line 646, in run_until_complete
return future.result()
File "/user/app/script.py", line 53, in main
(await conn.fetchrow(";"))
File "/user/app/venv/lib/python3.10/site-packages/asyncpg/connection.py", line 678, in fetchrow
data = await self._execute(
File "/user/app/venv/lib/python3.10/site-packages/asyncpg/connection.py", line 1658, in _execute
result, _ = await self.__execute(
File "/user/app/venv/lib/python3.10/site-packages/asyncpg/connection.py", line 1683, in __execute
return await self._do_execute(
File "/user/app/venv/lib/python3.10/site-packages/asyncpg/connection.py", line 1730, in _do_execute
result = await executor(stmt, None)
File "asyncpg/protocol/protocol.pyx", line 201, in bind_execute
asyncpg.exceptions.InvalidSQLStatementNameError: unnamed prepared statement does not exist
HINT:
NOTE: pgbouncer with pool_mode set to "transaction" or
"statement" does not support prepared statements properly.
You have two options:
* if you are using pgbouncer for connection pooling to a
single server, switch to the connection pool functionality
provided by asyncpg, it is a much better option for this
purpose;
* if you have no option of avoiding the use of pgbouncer,
then you can set statement_cache_size to 0 when creating
the asyncpg connection object.
Metadata
Metadata
Assignees
Labels
No labels