sql >> Databasteknik >  >> RDS >> PostgreSQL

psycopg2 cursor.execute() med SQL-frågeparametern orsakar syntaxfel

Jag tror att parametriserade uttalanden som detta är avsedda att användas med värden och inte tabellnamn (eller SQL-nyckelord, etc.). Så du har i princip tur med det här.

Men oroa dig inte, eftersom den här mekanismen är avsedd att förhindra SQL-injektion, och du vet normalt vilken tabell du vill komma åt vid kodskrivningstidpunkten, så det finns liten chans att någon kan injicera skadlig kod. Fortsätt bara och skriv tabellen i strängen.

Om du av någon (möjligen pervers) anledning behåller tabellnamnets parametrisk så här:

  1. Om tabellnamnet kommer från ditt program (t.ex. en ordbok eller klassattribut) gör du det vanliga strängbytet.
  2. Om tabellnamnet kommer från den yttre världen (tänk "användarinmatning"):gör antingen inte det, eller lita på användaren helt och hållet och tillämpa den tidigare metoden 1.

Till exempel:

cursor.execute(
    'SELECT * FROM %s where %s = %s'
    % ("my_table", "colum_name", "%s"), #1
    ("'some;perverse'string;--drop table foobar")) #2

#1 :Låt den tredje %s ersättas med en annan '%s' vid denna tidpunkt, för att möjliggöra senare bearbetning av psycopg2#2 :Det här är strängen som kommer att citeras korrekt av psycopg2 och placeras istället för den tredje "%s" i originalsträngen



  1. Två tabeller med samma kolumner eller en tabell med ytterligare kolumn?

  2. Använda resultat från en fråga inom samma fråga

  3. Hur hittar man främmande nyckelberoenden i SQL Server?

  4. Hämta och visa BLOB-bilder från Mysql-databasen med Tkinter