Credo che affermazioni parametrizzate come questa debbano essere utilizzate con valori e non i nomi delle tabelle (o le parole chiave SQL, ecc.). Quindi sei praticamente sfortunato con questo.
Tuttavia, non preoccuparti, poiché questo meccanismo ha lo scopo di prevenire l'iniezione di SQL e normalmente sai a quale tabella desideri accedere al momento della scrittura del codice, quindi ci sono poche possibilità che qualcuno possa iniettare codice dannoso. Basta andare avanti e scrivere la tabella nella stringa.
Se, per qualche motivo (forse perverso) mantieni il nome della tabella parametrico in questo modo:
- Se il nome della tabella deriva dal tuo programma (ad es. un dizionario o un attributo di classe), esegui la consueta sostituzione di stringhe.
- Se il nome della tabella proviene dal mondo esterno (pensa all'"input dell'utente"):o non farlo, o fidati completamente dell'utente e applica l'approccio precedente 1.
Ad esempio:
cursor.execute(
'SELECT * FROM %s where %s = %s'
% ("my_table", "colum_name", "%s"), #1
("'some;perverse'string;--drop table foobar")) #2
#1
:Lascia che il terzo %s venga sostituito con un altro '%s' in questo momento, per consentire un'elaborazione successiva da parte di psycopg2#2
:Questa è la stringa che verrà citata correttamente da psycopg2 e posizionata al posto del terzo '%s' nella stringa originale