具有两个参数的参数化SQL查询,其中一个是列表的集合

时间:2019-07-02 08:47:57

标签: python pandas python-2.7 sqlite

我有大型数据库,正在使用python中的sql查询将数据写入csv文件。在sql数据库中,每一行都是手指ID的一系列空间信息。我可以参数化查询以获取信息并为每个手指编写所需的文件。但是,在创建功能的for循环时会出现问题,该循环会遍历列表中所有索引的每个ID。

INDEX = ([44,48,50,55,56,57], [49,54,57,61,62,64])


FINGER = ('rt100', 'rt101')

d = {}
for Y,X in FINGER, INDEX:
    d[Y] = pd.read_sql ("SELECT x,y, CAST( (direction*180/3.142)as INT),CAST(quality*100 as INT) from UTS_7_fingerprints where finger like ? and ind = ?", conn, params=(Y,X,))

这是我当前拥有的代码,但是出现此错误:

pandas.io.sql.DatabaseError: Execution failed on sql 'SELECT x,y, CAST( (direction*180/3.142)as INT),CAST(quality*100 as INT) from UTS_7_fingerprints where finger like ? and ind = ?': Error binding parameter 0 - probably unsupported type.

即使尝试为单个ID和单个索引列表尝试循环,我也会收到错误,提示要解包的值太多。 我似乎找不到找到在SQL语句中包含列表列表的方法。

要明确我要做什么。我需要为列表'[44,48,50,55,56,57]'中的每个索引遍历ID,例如'rt100',并获取数据'SELECT x,y,CAST((direction * 180 / 3.142 ),将每个索引和ID的CAST(quality * 100作为INT)' 这样会生成一个.csv文件,如下所示:

372,402,281,83
394,303,303,97
415,422,123,86
458,328,292,95
464,487,112,96
483,389,303,95

1 个答案:

答案 0 :(得分:0)

如果您需要FINGER和INDEX元素的每种组合,则应该执行以下操作:

for Y in FINGER:
    for X in INDEX:
        for x in X:
            d[Y] = pd.read_sql ("SELECT x,y, CAST( (direction*180/3.142)as INT),CAST(quality*100 as INT) from UTS_7_fingerprints where finger like ? and ind = ?", conn, params=(Y,x))

(请注意x中的小params

更新,如下所示:

for i,Y in enumerate(FINGER):
    for x in INDEX[i]:
        d[Y] = pd.read_sql ("SELECT x,y, CAST( (direction*180/3.142)as INT),CAST(quality*100 as INT) from UTS_7_fingerprints where finger like ? and ind = ?", conn, params=(Y,x))

在您的代码中,对于单个x的每次read_sql调用,d [Y]也将被覆盖,因此您可能希望使用类似d[Y,x] = ...的东西。