sql >> Database teknologi >  >> RDS >> PostgreSQL

psycopg2 cursor.execute() med SQL-forespørgselsparameter forårsager syntaksfejl

Jeg tror, ​​at parametriserede udsagn som dette er beregnet til at blive brugt med værdier og ikke tabelnavne (eller SQL-nøgleord osv.). Så du er dybest set uheldig med dette.

Du skal dog ikke bekymre dig, da denne mekanisme er beregnet til at forhindre SQL-injektion, og du normalt ved, hvilken tabel du vil have adgang til ved kodeskrivning, så der er ringe chance for, at nogen kan injicere ondsindet kode. Bare gå videre og skriv tabellen i strengen.

Hvis du af en eller anden (muligvis pervers) grund beholder tabelnavnets parametriske sådan:

  1. Hvis tabelnavnet kommer fra dit program (f.eks. en ordbog eller klasseattribut), så udfør den sædvanlige strengerstatning.
  2. Hvis tabelnavnet kommer fra den eksterne verden (tænk "brugerinput"):gør det enten ikke, eller stol helt på brugeren og anvend den tidligere fremgangsmåde 1.

For eksempel:

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

#1 :Lad den tredje %s erstattes med en anden '%s' på dette tidspunkt for at tillade senere behandling af psycopg2#2 :Dette er strengen, der bliver korrekt citeret af psycopg2 og placeret i stedet for den tredje '%s' i den originale streng



  1. hvor er min database gemt, når jeg opretter den i MySQL?

  2. Ser på databasen på heroku

  3. Løbende antal i alt med PostgresQL

  4. MySql randomiser de sidste 10 rækker