BACK: Inserting a variable into cur.execute statement

Поиск
Список
Период
Сортировка
От Hagen Finley
Тема BACK: Inserting a variable into cur.execute statement
Дата
Msg-id f8e31d3b-f5f4-0e9b-0318-0cddd77fd988@datasundae.com
обсуждение исходный текст
Ответ на Re: Inserting variable into  (Adrian Klaver <adrian.klaver@aklaver.com>)
Ответы Re: BACK: Inserting a variable into cur.execute statement  (Daniele Varrazzo <daniele.varrazzo@gmail.com>)
Re: BACK: Inserting a variable into cur.execute statement  (Adrian Klaver <adrian.klaver@aklaver.com>)
Список psycopg

Hello,

I finally got around to trying to implement this code and I am running into an "IndexError: tuple index out of range" problem.

I am running a function with parameters from a list:

def def_acct_analysis(sht,acct):    print(param[par][0])    print(param[par][1])    sheet = "sheet"+str(sht)    print(sheet)    account = acct    print(account)

par = 0
param = [(1,'ACCT0'),(2,'ACCT1'),(3,'ACCT2'),]

for p in param:    def_acct_analysis(param[par][0], param[par][1])
    par += 1
#Print statements above output:

1
ACCT0
sheet1
ACCT0
I want to insert the account name 'ACCT0' into my cur.execute but I get an error with this code:

cur.execute("SELECT COALESCE(SUM(revusd),0) FROM sfdc where stage LIKE 'Win%' AND saccount = %s", (account,))
wind1 = cur.fetchone()
conn.commit()
Traceback (most recent call last):
  File "
/home/datasundae/PycharmProjects/Registration_Reports/sfdc_Account_Tab_Analysis_Function.py", line 333, in <module>
    def_acct_analysis(param[par][0], param[par][1])
  File "/home/datasundae/PycharmProjects/Registration_Reports/sfdc_Account_Tab_Analysis_Function.py", line 96, in def_acct_analysis
    cur.execute("SELECT COALESCE(SUM(revusd),0) FROM sfdc where stage LIKE 'Win%' AND saccount = %s", (account,))
IndexError: tuple index out of range
I've returned to the psycopg docs but I don't see my error. Can someone else see it?

Best,

Hagen

On 12/7/20 3:31 PM, Adrian Klaver wrote:
On 12/7/20 2:26 PM, hagen@datasundae.com wrote:
So if I understand this correctly my new cur.execute would read:

account = 'JPMC'

  cur.execute("SELECT SUM(revusd) FROM sfdc where saccount = %s AND stage LIKE 'Commit%';",(account ))

Since you are using a tuple this (account ) would need to be (account,) per the docs at link previously posted:


"For positional variables binding, the second argument must always be a sequence, even if it contains a single variable (remember that Python requires a comma to create a single element tuple):"




and that would translate to

cur.execute("SELECT SUM(revusd) FROM sfdc where saccount = 'JPMC' AND stage LIKE 'Commit%';")

is that right?



Not sure what below is supposed to be about?


Note You can use a Python list as the argument of the IN operator using the PostgreSQL ANY operator.
ids = [10, 20, 30]
cur.execute("SELECT * FROM data WHERE id = ANY(%s);", (ids,))
Furthermore ANY can also work with empty lists, whereas IN () is a SQL syntax error.

-----Original Message-----
From: Adrian Klaver <adrian.klaver@aklaver.com>
Sent: Monday, December 7, 2020 3:04 PM
To: hagen@datasundae.com; psycopg@lists.postgresql.org; psycopg@postgresql.org
Subject: Re: Inserting variable into

On 12/7/20 2:02 PM, hagen@datasundae.com wrote:
Hello,

I'd like to use a variable for 'Big Company' (e.g. account) or where = statements generally in my cur.execute statements:

cur.execute("SELECT SUM(revusd) FROM sfdc where saccount = 'Big Company' AND stage LIKE 'Commit%';")
commitd1 = cur.fetchone()
conn.commit()

but I don't know the proper syntax with the cur.execute statement to use a variable.

https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries


I imagine others do  - thanks!

Best,

Hagen







В списке psycopg по дате отправления:

Предыдущее
От: Daniele Varrazzo
Дата:
Сообщение: Re: Executing on the connection?
Следующее
От: Daniele Varrazzo
Дата:
Сообщение: Re: BACK: Inserting a variable into cur.execute statement