Python, SQL:设置列为参数读取

1 投票
2 回答
1810 浏览
提问于 2025-04-16 08:17

我有一个SQL查询,是用Python和Psycopg2库写的。这个查询是从arches表中读取一些列的数据:

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

我想把这个查询参数化,也就是说,不想通过字符串拼接来指定需要的列,而是用参数的方式来做,这样看起来更优雅。

简单的方法是用SELECT *,然后再筛选出我需要的列。但是这样会给数据库和网络带来不必要的数据负担,所以我想避免这种做法。

有什么好的建议吗?

亚当

2 个回答

0

你不能直接给元数据加参数。你需要创建一个映射,把某个标识符和你想要的字段列表关联起来,然后使用这个映射。

2

在数据库的API中,列名不能作为参数直接放在SQL字符串里,这样做也没有意义。

如果你需要检查输入的列名,最好先对它进行清理。

不过,像模糊查询这样的字符串可以作为参数传入。

下面的代码示例会更好,如果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(),),)会生成一个包含%字符串内容%的字符串。最后,数据库API会对%字符串内容%进行转义,并加上引号,这样就形成了最终的查询。

撰写回答