public inbox for [email protected]
help / color / mirror / Atom feedFrom: Adrian Klaver <[email protected]>
To: Daniel Johnson <[email protected]>
To: [email protected]
Subject: Re: Parameter in SQL query being misinterpreted
Date: Thu, 5 Dec 2024 17:37:46 -0800
Message-ID: <[email protected]> (raw)
In-Reply-To: <[email protected]>
References: <[email protected]>
On 12/5/24 17:27, Daniel Johnson wrote:
> Good day! I've run into a quirk executing an SQL statement and am not
> sure if it's a fundamental issue with my query or a bug in psycopg3.
>
> In short, I'm inserting/updating a row using both NOW() and 'NOW() plus
> a varying value'. The NOW() value is fine, but what ends up in the
> database for the second one is just "NOW() + 4 seconds". I finally
> realized this is because of how the command is being processed, the
> variable becomes "$4" and apparently the dollar sign is lost.
>
> I'm guessing this is an example of why one of the bullet points at
> https://www.psycopg.org/psycopg3/docs/basic/params.html says "The
> placeholder must not be quoted". :-/ I would appreciate any advice on
> how to work around this while still passing in the value safely
Pretty sure the below does not work because the placeholder is becoming
part of the literal string:
NOW() + INTERVAL '%(NextDBLog)s SECOND'
You might try something like:
NOW() + INTERVAL || ' ' || %(NextDBLog)s || ' SECOND'
If that does work then you will need to use the psycopg.sql module to
build that part of the query
>
>
> Here's the command from Python. The value we're looking at is for
> "nextupdate". "Stats" is a dictionary which contains "NextDBLog" as an
> integer whose value is something between 120 and 800.
> =-=-=-=-=-=-=-=-=-
> dbRWcur.execute('''
> INSERT INTO backendstatus
> (nodeid, debug, started, lastupdated, nextupdate, version,
> platform, python, cpucores, state, uptime, taskstats)
> VALUES
> (%(nodeid)s, %(debug)s, %(laststarteddb)s, NOW(), NOW() +
> INTERVAL '%(NextDBLog)s SECOND', %(version)s, %(platform)s, %(python)s,
> %(cpucores)s, %(state)s, %(uptime)s, %(statsstring)s)
> ON CONFLICT
> (nodeid)
> DO UPDATE SET
> debug = excluded.debug,
> started = excluded.started,
> lastupdated = excluded.lastupdated,
> nextupdate = excluded.nextupdate,
> version = excluded.version,
> platform = excluded.platform,
> python = excluded.python,
> cpucores = excluded.cpucores,
> state = excluded.state,
> uptime = excluded.uptime,
> taskstats = excluded.taskstats;
> ''', Stats)
> =-=-=-=-=-=-=-=-=-
>
>
> After the command is processed this is the contents of
> dbRWcur._query.query.decode('utf-8').
> =-=-=-=-=-=-=-=-=-
> INSERT INTO backendstatus
> (nodeid, debug, started, lastupdated, nextupdate, version,
> platform, python, cpucores, state, uptime, taskstats)
> VALUES
> ($1, $2, $3, NOW(), NOW() + INTERVAL '$4 SECOND', $5, $6, $7, $8,
> $9, $10, $11)
> ON CONFLICT
> (nodeid)
> DO UPDATE SET
> debug = excluded.debug,
> started = excluded.started,
> lastupdated = excluded.lastupdated,
> nextupdate = excluded.nextupdate,
> version = excluded.version,
> platform = excluded.platform,
> python = excluded.python,
> cpucores = excluded.cpucores,
> state = excluded.state,
> uptime = excluded.uptime,
> taskstats = excluded.taskstats;
> =-=-=-=-=-=-=-=-=-
>
> This is being run on Rocky Linux v9.5 (essentially Red Hat / RHEL). The
> relevant installed packages are:
> python3-3.9.19-8.el9_5.1.x86_64
> python3-psycopg3-3.1.18-4.el9.noarch (from EPEL)
> postgresql-server-15.8-2.module+el9.5.0+28955+a22540b0.x86_64
>
>
>
> Daniel Johnson
> [email protected]
>
>
>
--
Adrian Klaver
[email protected]
view thread (6+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected], [email protected], [email protected]
Subject: Re: Parameter in SQL query being misinterpreted
In-Reply-To: <[email protected]>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox