asyncpg icon indicating copy to clipboard operation
asyncpg copied to clipboard

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

Open mbrancato opened this issue 7 months ago • 2 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.

mbrancato avatar Nov 21 '23 06:11 mbrancato

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 avatar Nov 21 '23 07:11 elprans

@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.

mbrancato avatar Nov 21 '23 08:11 mbrancato