Python, SQL:设置列为参数读取
我有一个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会对%字符串内容%进行转义,并加上引号,这样就形成了最终的查询。