PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

psycopg2 cursor.execute() с параметър на SQL заявка причинява синтактична грешка

Вярвам, че параметризирани изрази като това са предназначени да се използват с стойности а не имена на таблици (или SQL ключови думи и т.н.). Така че всъщност нямате късмет с това.

Въпреки това, не се притеснявайте, тъй като този механизъм е предназначен да предотврати инжектиране на SQL и обикновено знаете до коя таблица искате да получите достъп по време на писане на код, така че има малък шанс някой да инжектира зловреден код. Просто продължете и напишете таблицата в низа.

Ако по някаква (вероятно погрешна) причина запазите името на таблицата параметрично по този начин:

  1. Ако името на таблицата идва от вашата програма (напр. речник или атрибут на клас), тогава направете обичайното заместване на низ.
  2. Ако името на таблицата идва от външния свят (помислете за „въведено от потребителя“):или не правете това, или се доверете напълно на потребителя и приложете предишния подход 1.

Например:

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

#1 :Нека третият %s да бъде заменен с друг '%s' в този момент, за да позволи по-късна обработка от psycopg2#2 :Това е низът, който ще бъде правилно цитиран от psycopg2 и поставен вместо този трети '%s' в оригиналния низ



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Актуализация на Postgresql с присъединяване

  2. заявка за администратора на първия ми ред за никога изтриване

  3. ProtocolViolation:ГРЕШКА:съобщението за свързване предоставя 0 параметъра, но подготвеният израз изисква 1

  4. ще презапише ли pg_restore съществуващите таблици?

  5. Изчисляване на проценти със заявка GROUP BY