1

我有一个 SQL 查询,在 Python 中使用Psycopg2疯狂。查询从表中读取一些列arches

rows = archesDB.read_all("""SELECT "+str(columns)[1:-1].replace("'","")+" 
                           FROM arches 
                           WHERE lower(arch) like '%%%s%%'""" % (arch.lower()))

我想参数化这个查询,这样它就不会指定使用字符串连接所需的列,而是作为参数 - 一种更优雅的方式。

天真的方法是SELECT *过滤掉我需要的列。但这会给数据库和网络带来不必要的数据负担,所以我宁愿避免它。

有任何想法吗?

亚当

4

2 回答 2

2

列名不能作为 DB API 中的参数在 SQL 字符串中传递。而且它也没有任何意义。

如果您需要检查列名输入,请事先对其进行清理。

不过,like 字符串应该作为参数输入

如果 columns 变量包含列名的字符串列表,则以下代码示例将是一个改进:

rows = archesDB.read_all("""SELECT %s 
                       FROM arches 
                       WHERE lower(arch) like %%s""" % (",".join(columns),),
                       ("%%%s%%" % (arch.lower(),),))

首先,列名插入到第一个替换 (%s) 中,最后一个 %%s 转换为 %s。然后 ("%%%s%%" % (arch.lower(),),) 用 %string_content% 创建一个字符串。最后,db api 转义 %string_content% 并向其添加引号,最终进行查询。

于 2010-12-09T12:40:56.310 回答
0

您不能参数化元数据。创建某个标识符到所需字段列表的映射,并使用它。

于 2010-12-09T10:27:59.613 回答