Python,SQL:将列设置为参数
我有一个SQL查询,在Python中使用mad。查询从Python,SQL:将列设置为参数,python,sql,parameters,psycopg2,Python,Sql,Parameters,Psycopg2,我有一个SQL查询,在Python中使用mad。查询从arch表中读取一些列: rows = archesDB.read_all("""SELECT "+str(columns)[1:-1].replace("'","")+" FROM arches WHERE lower(arch) like '%%%s%%'""" % (arch.lower())) 我想对这个查询进行参数化,这
arch
表中读取一些列:
rows = archesDB.read_all("""SELECT "+str(columns)[1:-1].replace("'","")+"
FROM arches
WHERE lower(arch) like '%%%s%%'""" % (arch.lower()))
我想对这个查询进行参数化,这样它就不会使用字符串连接来指定所需的列,而是作为参数来指定,这是一种更加优雅的方式
最简单的方法是选择*
,然后过滤掉我需要的列。但这会给数据库和网络带来不必要的数据负担,因此我宁愿避免这样做
有什么想法吗
Adam您不能参数化元数据。创建某个标识符到所需字段列表的映射,并使用该映射。列名不能作为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\u content%的字符串。
最后,db api转义%string_content%,并在其中添加引号,最后进行查询。也就是说,使用
选择*
并过滤所需的列?映射。然后从中获取要放入查询的字段列表。