从SQL查询的Python列表中删除括号

从SQL查询的Python列表中删除括号,python,pandas,Python,Pandas,可能重复: 我正在尝试将一个ticker列表放入SQL查询中。我是Python新手 cus是一个列表,设置为['x'、'y'、…、'a'] test = psql.frame_query( "select * from dataBase where cus IN (%r)", con = db) % cus 我试过了,但失败了 我的下一次尝试是删除括号,然后粘贴列表。如何卸下支架以便获得: cus2 = 'x', 'y', ..., 'a' 我打算做: str = "select

可能重复:

我正在尝试将一个ticker列表放入SQL查询中。我是Python新手

cus是一个列表,设置为['x'、'y'、…、'a']

test = psql.frame_query(
    "select * from dataBase where cus IN (%r)", con = db) % cus
我试过了,但失败了

我的下一次尝试是删除括号,然后粘贴列表。如何卸下支架以便获得:

cus2 = 'x', 'y', ..., 'a'
我打算做:

str = "select * from dataBase where cus IN (%r)" % cus2
test2 = psql.frame_query(str, con = db)
或者有没有其他方法可以让我尝试


谢谢。

使用SQL,您确实希望避免只将值插入查询。通常情况下,这要由数据库适配器来完成,它具有如何避免从值中创建危险SQL(SQL引号转义,也称为SQL注入攻击)的专门知识

不幸的是,该应用程序只半心半意地实现了参数支持

不要使用
frame\u query
,直接使用即可

首先,使用参数生成SQL查询。SQL参数的格式因数据库适配器而异,因为允许一些变体。我假设您在这里使用的是MySQL,它使用
%s
作为位置参数,与Python的语法相呼应:

sql = "select * from dataBase where cus IN ({0})".format(', '.join(['%s'] * len(cus2)))
这将为
cus2
中的每个值创建足够的参数。然后查询数据库:

cur = psql.execute(sql, con, params=cus2)
rows = cur.fetchall()
columns = [col_desc[0] for col_desc in cur.description]
cur.close()

result = DataFrame.from_records(rows, columns=columns, coerce_float=True)
由于您似乎正在使用该模块进行连接,因此必须针对库使用的SQL参数语法(有些非标准)对其进行调整。它只接受命名参数,命名参数的形式为
@name

params = dict(('@param{0}'.format(i), v) for i, v in enumerate(cus2))
sql = "select * from dataBase where cus IN ({0})".format(
    ', '.join(sorted(params.keys())))

cur = psql.execute(sql, con, params=params)
rows = cur.fetchall()
columns = [col_desc[0] for col_desc in cur.description]
cur.close()

result = DataFrame.from_records(rows, columns=columns, coerce_float=True)

总结:不要使用字符串插值(
%
)在SQL查询中包含值。改用SQL参数
pandas.io.sql
直接支持参数。非常感谢您的帮助。一个后续操作:对于cur=psql.execute(sql,con,params=cus2)行,我收到一个错误,它说:AttributeError:'list'对象没有属性'items',当前列表已设置['x','y',…]@user1911092:您正在连接到哪个数据库?如果我删除params片段并输入一个写有CU的字符串,我在学校拥有的数据库-测试工作以及用于连接到sybase的库是什么?