Как безопасно заключить полное имя таблицы в качестве строкового литерала для приведения в psycopg2/psycopg?Python

Программы на Python
Ответить
Anonymous
 Как безопасно заключить полное имя таблицы в качестве строкового литерала для приведения в psycopg2/psycopg?

Сообщение Anonymous »

Я хочу динамически и безопасно сгенерировать этот тип SQL в psycopg2/psycopg:

Код: Выделить всё

'"my_schema_name"."my_table_name"'::regclass
где my_schema и my_table_name — произвольные значения (они могут иметь специальные символы, такие как « и '). Как я могу сгенерировать этот SQL, используя класс sql psycopg?
Если я попробую это:

Код: Выделить всё

import psycopg2
import psycopg2.sql as sql

with psycopg2.connect('postgresql://postgres:postgres@127.0.0.1:5432') as conn:
with conn.cursor() as cursor:
cursor.execute(sql.SQL('''
SELECT *
FROM pg_inherits
WHERE inhparent = {identifier}::regclass
''').format(identifier=sql.Identifier('my_schema', 'my_table')))
Тогда я (правильно) получаю сообщение об ошибке

Код: Выделить всё

psycopg2.errors.UndefinedTable: missing FROM-clause entry for table "my_schema"
LINE 4:             WHERE inhparent = "my_schema"."my_table"::regcla...
Если я попробую это:

Код: Выделить всё

import psycopg2
import psycopg2.sql as sql

with psycopg2.connect('postgresql://postgres:postgres@127.0.0.1:5432') as conn:
with conn.cursor() as cursor:
cursor.execute(sql.SQL('''
SELECT *
FROM pg_inherits
WHERE inhparent = {identifier}::regclass
''').format(identifier=sql.Literal(sql.Identifier('my_schema', 'my_table'))))
После этого я получаю сообщение об ошибке

Код: Выделить всё

psycopg2.ProgrammingError: can't adapt type 'Identifier'
Я знаю, что смогу это сделать:

Код: Выделить всё

(quote_ident({schema_name}) || '.' || quote_ident({table_name}))::regclass
А затем свяжите имя_схемы и имя_таблицы как sql.Literal , но в запросах, которые я выполняю, это происходит странно медленнее (более чем на 50%). Я также знаю, что могу также присоединиться к pg_class и pg_namespace, но я часто обнаруживал, что это медленнее, чем использование шаблона ::regclass
Поэтому я хотел бы безопасно сгенерировать '"my_schema"."my_table_name"'::regclass (и если ничего другого, просто из любопытства, как это сделать!)
Контекст таков, что я создаю пакет Python, который проверяет/управляет разрешения в PostgreSQL для произвольных таблиц.

Подробнее здесь: https://stackoverflow.com/questions/798 ... or-casting
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»