MagicStack / asyncpg

A fast PostgreSQL Database Client Library for Python/asyncio.
Apache License 2.0
6.99k stars 404 forks source link

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

Open mbrancato opened 11 months ago

mbrancato commented 11 months ago

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.

elprans commented 11 months ago

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.

mbrancato commented 11 months ago

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