Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,SQL:将列设置为参数_Python_Sql_Parameters_Psycopg2 - Fatal编程技术网

Python,SQL:将列设置为参数

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())) 我想对这个查询进行参数化,这

我有一个SQL查询,在Python中使用mad。查询从
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%,并在其中添加引号,最后进行查询。

也就是说,使用
选择*
并过滤所需的列?映射。然后从中获取要放入查询的字段列表。