MagicStack / asyncpg

A fast PostgreSQL Database Client Library for Python/asyncio.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Document how to confirm that `INSERT` worked with prepared statement

mbrancato opened this issue · comments

When using execute() I can parse the command output for INSERT to confirm a single row inserted like INSERT 0 1. However, execute() does not support the LRU for automatically prepared statements. Can you document how to confirm that the INSERT worked using a fetch*() method that will use the LRU? I do sometimes see INSERT 0 0 results in some high-volume workloads (likely just duplicate data), and these do not raise UniqueViolationError, QueryCanceledError, or some TimeoutError.

execute() uses prepared statements if there are arguments, which is likely in the case of insert.

I do sometimes see INSERT 0 0 results in some high-volume workloads

Depending on how your insert body looks it's totally possible to insert zero rows. For example, INSERT INTO foo (select * where false) will return INSERT 0 0.

@elprans ahh thanks, I was going by the documentation which excludes execute() for the built-in LRU cache of prepared statements and only includes fetch*().

asyncpg automatically maintains a small LRU cache for queries executed during calls to the fetch(), fetchrow(), or fetchval() methods.