如何在Python cur.execute中的SQL查询中参数化表名?

问题描述

我有sql

jobs.gen_pk
jobs.gen_ind
jobs.gen_af

我有一个运行查询的Python代码

cur.execute(f"SELECT max(batch_id) FROM jobs.gen_pk")

我需要参数化pk部分, 就像从其他表中读取一样 使用configParser

cur.execute(f"SELECT max(batch_id) FROM jobs.gen_(parametrize this)")

这是我现在拥有的代码 显然,SQL查询无法正常工作。

import configparser
import psycopg2
parser = configparser.ConfigParser()
base_path = os.path.dirname(os.path.realpath(__file__))
parser.read(os.path.join(base_path,'FileConfig.cfg'))
dbname = parser.get('file_config','dbname')
host = parser.get('file_config','host')
port = parser.get('file_config','port')
user = parser.get('file_config','user')
location = parser.get('file_config','location') #pk,ind,af

cur.execute(f"SELECT max(batch_id) FROM jobs.gen_(location)")

解决方法

您似乎只是想要:

cur.execute("SELECT max(batch_id) FROM jobs.gen_" + location)

请注意,此类构造为SQL注入打开了代码。如果为location提供了恶意字符串,则可能会发生不良情况。如果该值来自代码之外,那么您应该在运行查询之前正确验证它(例如,通过对照固定的允许值列表进行检查)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...