(2) совершенно не связан с PostgreSQL, возможно, отредактируйте его из этого вопроса и опубликуйте в новом вопросе? Я отвечу (1).
Как вы уже догадались, вы не можете передавать такие вещи, как имена таблиц, в качестве параметров запроса.
Они отправляются как параметры привязки на уровне протокола, и (что очень важно) запрос должен анализироваться как действительный SQL с ними в качестве заполнителей. Это как если бы вы запускали SQL-уровень PREPARE
, а затем разделяли EXECUTE
. Вы должны отформатировать их в строку SQL перед ее подготовкой, используя соответствующие кавычки идентификатора.
Двойные кавычки идентификаторов, которые вы подставляете, и остерегайтесь возможных двойных кавычек в передаваемой строке, которые могут преждевременно закончить вашу последовательность в кавычках. Они должны быть удвоены. Например, для имени таблицы some"table
вы должны использовать:
'SELECT * FROM "{0}"'.format('some""table');
SQL-инъекция представляет собой очень серьезный риск; вы должны правильно цитировать точно. В идеале найдите клиентский эквивалент функции PostgreSQL quote_ident
SQL.
Обратите внимание, что идентификаторы в двойных кавычках чувствительны к регистру. Убедитесь, что вы создаете их с одним и тем же регистром в БД, всегда используя их в двойных кавычках, не смешивайте идентификаторы в кавычках и без кавычек.
person
Craig Ringer
schedule
08.10.2012