防止 SQL 命名标识符注入的语法

syntax to guard against SQL-injection of named identifiers

我正在阅读 psycopg2 documentation 并想知道如何使用名称参数化 SQL 表的标识符?这是一个例子:

import psycopg2

conn = psycopg2.connect()
cursor = conn.cursor()
cursor.execute(
   "SELECT * FROM %(my_table)s LIMIT %(my_limit)s;"
   vars={
       "my_limit": 42,                    # parametrizing literals works fine.
       "my_table": sql.Identifier("foo"), # how to do same with named identifiers?
   }
)
psycopg2.ProgrammingError: can't adapt type 'Identifier'

我知道我可以使用位置参数 %s{} 但我希望查询将标识符与具有命名映射的文字混合和匹配。

这是为我做的:

import psycopg2
from psycopg2 import sql

conn = psycopg2.connect()
cursor = conn.cursor()
cursor.execute(sql.SQL(
    "SELECT * FROM {my_table} LIMIT {my_limit};"
  ).format(
    my_limit = sql.Literal(42),
    my_table = sql.Identifier("foo"),
  ).as_string(conn)
)