PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

psycopg2 cursor.execute() z parametrem zapytania SQL powoduje błąd składni

Uważam, że takie parametryczne stwierdzenia mają być używane z wartościami a nie nazwy tabel (lub słowa kluczowe SQL itp.). Więc w zasadzie nie masz z tym szczęścia.

Jednak nie martw się, ponieważ ten mechanizm ma zapobiegać wstrzykiwaniu SQL, a zwykle wiesz, do której tabeli chcesz uzyskać dostęp w czasie pisania kodu, więc istnieje niewielka szansa, że ​​ktoś może wstrzyknąć złośliwy kod. Po prostu idź dalej i wpisz tabelę w łańcuchu.

Jeśli z jakiegoś (być może przewrotnego) powodu zachowujesz parametryczną nazwę tabeli w ten sposób:

  1. Jeżeli nazwa tabeli pochodzi z twojego programu (np. ze słownika lub atrybutu klasy), wykonaj zwykłe podstawienie ciągu.
  2. Jeśli nazwa tabeli pochodzi ze świata zewnętrznego (pomyśl „dane wejściowe użytkownika”):albo nie rób tego, albo całkowicie zaufaj użytkownikowi i zastosuj poprzednie podejście 1.

Na przykład:

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

#1 :Niech trzeci %s zostanie zastąpiony innym '%s' w tym momencie, aby umożliwić późniejsze przetwarzanie przez psycopg2#2 :To jest ciąg, który będzie poprawnie cytowany przez psycopg2 i umieszczony zamiast trzeciego '%s' w oryginalnym ciągu



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak czytać z 32-bitowego .mdb z 64-bitowym sterownikiem Pythona i odbc?

  2. Odpowiedniki HEX() i UNHEX() MySQL w Postgresie?

  3. Czy PostgreSQL może indeksować kolumny tablicy?

  4. ubuntu `env:‘pg_dump’:Brak takiego pliku lub katalogu` błąd

  5. Wywołanie funkcji zdefiniowanej przez użytkownika znajdującej się w postgres.c w postgreSQL przy użyciu GUI zdefiniowanego przez netbeans