Ik geloof dat geparametriseerde uitspraken zoals deze bedoeld zijn om te worden gebruikt met waarden en geen tabelnamen (of SQL-sleutelwoorden, enz.). Je hebt hier dus eigenlijk pech mee.
Maak je echter geen zorgen, want dit mechanisme is bedoeld om SQL-injectie te voorkomen, en je weet normaal gesproken welke tabel je wilt openen op het moment dat de code wordt geschreven, dus er is weinig kans dat iemand kwaadaardige code injecteert. Ga je gang en schrijf de tabel in de string.
Als je om een of andere (mogelijk perverse) reden de tabelnaam zo parametrisch houdt:
- Als de tabelnaam uit uw programma komt (bijvoorbeeld een woordenboek of klasseattribuut), voer dan de gebruikelijke tekenreeksvervanging uit.
- Als de tabelnaam uit de buitenwereld komt (denk aan "gebruikersinvoer"):doe dat ofwel niet, of vertrouw de gebruiker volledig en pas de vorige benadering toe 1.
Bijvoorbeeld:
cursor.execute(
'SELECT * FROM %s where %s = %s'
% ("my_table", "colum_name", "%s"), #1
("'some;perverse'string;--drop table foobar")) #2
#1
:laat de derde %s nu vervangen door een andere '%s', zodat latere verwerking door psycopg2#2
mogelijk is :Dit is de tekenreeks die correct wordt geciteerd door psycopg2 en in plaats van die derde '%s' in de originele tekenreeks wordt geplaatst