Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.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 - Fatal编程技术网

如何将python字符串列表传递给sql查询

如何将python字符串列表传递给sql查询,python,Python,如何将python字符串列表传递给SQL查询,例如select*from table where name in(names\u from\u python\u list)wherenames\u from\u python\u list字符串是否以逗号分隔 执行,'.join(名称列表中名称的名称)以字符串形式给出列表中的所有名称,即 select * from table where name in ('john,james,mary') 鉴于,我想做的是: select * fro

如何将python字符串列表传递给SQL查询,例如
select*from table where name in(names\u from\u python\u list)
where
names\u from\u python\u list
字符串是否以逗号分隔

执行
,'.join(名称列表中名称的名称)
以字符串形式给出列表中的所有名称,即

 select * from table where name in ('john,james,mary')
鉴于,我想做的是:

  select * from table where name in ('john','james','mary')

通过
'、'
连接,并通过
'
将所有内容括起来(不要忘了用
\'
替换名称中的
'
,以转义它们):

或者您可以使用
str.format
获取列表的
str
(减去
[]
,因此切片),使用这种方式将更改字符串周围的引号,即,如果字符串是
'O'Hara'
,它将被转换为
“O'Hara”


根据您正在使用的功能?可以表示python变量,如

*“从名称所在的表中选择*;”,(列表,)*


这可能取决于驱动程序的特性,但对于标准DB API,它应该如下所示:

connection.execute('SELECT * FROM table WHERE name IN (?)', (names,))

对于某些驱动程序,
也可能是
:1
%s
等。

我建议查看成熟数据库库提供的本机解决方案,而不是重新发明轮子

例如,psqycopg2允许注册适配器,以便处理列表(和其他序列)变得透明,您可以直接将列表作为查询参数传递。下面是一个例子:

pymysql还提供了一组很好的内置转义器,其中包括一个用于处理序列的转义器,这样您就不必担心手动格式化(这很容易出错),并且可以直接使用tuple作为in子句中的参数。例如:

>>> conn = pymysql.connect(host='localhost', user='root', password='root', db='test')
>>> c.execute('select * from hosts where ip in %s', (('ip1', 'ip2'),))
>>> c.fetchall()
((1, 'mac1', 'ip1'), (3, None, 'ip2'))

可以肯定的是,许多其他成熟的库/框架都提供了类似的功能。

您也可以将元组传递到SQL查询中:

query=f“从{tuple(names)}中包含名称的表中选择*”
c、 执行(查询,连接)
它也比使用以下工具更健壮:

query=“从名称所在的表中选择*(?)”
c、 执行(查询、连接、参数)
因为你没有得到错误

OperationalError:(sqlite3.OperationalError)SQL变量太多

。。。将大量变量传递到查询中时,'.join('\''+i+'\''表示名称列表中的i)可能取决于数据库和驱动程序。无论如何,出于安全原因,我不建议使用任何涉及字符串连接的方法。您能否提供用于连接数据库的DB-API驱动程序以及用于从Python查询数据库的代码?正如一些人已经提到的,一些库提供了实现的可能性,这就排除了进行字符串操作的必要性。如果我的名字是
Scarlett O'Hara
,更不用说了?@bereal感谢你的提醒,我修复了它,尽管
str(names)[1:-1]
自动包含
'
通过
(反之亦然),如果字符串同时包含这两个字符串,则会将其转义,但由于某些RDBMS不支持双引号字符串,我认为手动操作更好。
connection.execute('SELECT * FROM table WHERE name IN (?)', (names,))
>>> conn = pymysql.connect(host='localhost', user='root', password='root', db='test')
>>> c.execute('select * from hosts where ip in %s', (('ip1', 'ip2'),))
>>> c.fetchall()
((1, 'mac1', 'ip1'), (3, None, 'ip2'))