Skip to content

asyncpg.exceptions.DuplicatePreparedStatementError: prepared statement “stmt_5” already exists #149

Closed
@johannspies

Description

@johannspies
  • asyncpg version:
    0.8.4-1
  • PostgreSQL version:

9.6

  • Python version:

3.5.3-1

  • Platform:

LInux. Debian

  • Do you use pgbouncer?:

No

  • Did you install asyncpg with pip?:

No

  • If you built asyncpg locally, which version of Cython did you use?:
  • Can the issue be reproduced under both asyncio and
    uvloop?
    :

No. It is too complicated.

0
down vote
favorite

The function "runquery" gets called from different parts of a program. I never use "prepare" in my query statements in this case. I have read all the other questions about "prepared statement already exists" and have tried "DEALLOCATE ALL" also. But that results in the opposite error: while the error below complains that the prepared statement already exists, DEALLOCATE ALL results in a complaint that it does not exist.

This is my first attempt to run this type of program using asyncpg.

After many queries as shown below, runquery ends with an error reporting:

Could not complete query "select uuid from wos_2017_1.combined_name where combined_name = 'xxxxxxx';"

Traceback (most recent call last):
  File "update2017.py", line 1206, in runquery
    result = await con.fetch(query)
  File "/usr/lib/python3/dist-packages/asyncpg/connection.py", line 268, in fetch
    stmt = await self._get_statement(query, timeout)
  File "/usr/lib/python3/dist-packages/asyncpg/connection.py", line 212, in _get_statement
    state = await protocol.prepare(None, query, timeout)
  File "asyncpg/protocol/protocol.pyx", line 140, in prepare      (asyncpg/protocol/protocol.c:55210)
  File "/usr/lib/python3.5/asyncio/futures.py", line 380, in __iter__
yield self  # This tells Task to wait for completion.
  File "/usr/lib/python3.5/asyncio/tasks.py", line 304, in _wakeup
    future.result() 
  File "/usr/lib/python3.5/asyncio/futures.py", line 293, in result
raise self._exception
asyncpg.exceptions.DuplicatePreparedStatementError: prepared statement "stmt_7" already exists
$ grep -c  INSERT /tmp/y.log
1006
$ grep -c  SELECT /tmp/y.log
1364
$ grep -ci  UPDATE /tmp/y.log
1044
$ grep -ci  delete /tmp/y.log
2548
    import asyncio,asyncpg

    async def make_pool():
         """Create asyncpg connection pool to database"""

         pool = await asyncpg.create_pool(database='wos',
                                 host = 'localhost',
                                 user = 'xx',
                                 password='xxxxxx',


                     port=5432,
                                 min_size=10,
                                 max_size=50)

         return pool

    async def get_con(pool):
        con = await pool.acquire()
        return con

    async def runquery(query):
        con = await get_con(pool)
        try:
            if query.startswith('delete from') or query.startswith('insert'):
                result = await con.execute(query)
            else:
                result = await con.fetch(query)
        except:
            print('Could not complete query "{}"'.format(query))
            print(traceback.format_exc())
            result = None
            exit(1)
        finally:
            await pool.release(con)
        return result, success

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions