Параметризованный SQL-запрос с двумя параметрами, один из которых представляет собой набор списков. - PullRequest
0 голосов
/ 02 июля 2019

У меня есть большие базы данных, для которых я использую SQL-запрос в Python для записи данных в CSV-файлы. В базе данных sql каждая строка представляет собой последовательность пространственной информации для идентификатора пальца. Я могу параметризовать запрос, чтобы получить информацию и записать нужные мне файлы для каждого пальца. Однако проблема возникает при создании функционала для цикла, который выполняет итерации по каждому идентификатору для всех индексов в списке.

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.

Даже используя попытку цикла для одного идентификатора и одного списка индексов, я получаю ошибку, что слишком много значений для распаковки. Кажется, я не могу найти способ включить список в оператор SQL.

Чтобы было ясно, что я пытаюсь сделать. Мне нужно перебрать идентификаторы, такие как «rt100» для каждого индекса в списках «[44,48,50,55,56,57]» и получить данные «SELECT x, y, CAST ((direction * 180 / 3.142») ) как INT), CAST (качество * 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 голосов
/ 02 июля 2019

Если вам нужна каждая комбинация элемента 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))

Также в вашем коде d [Y] будет перезаписываться при каждом вызове read_sql для отдельных x, поэтому вы, возможно, захотите использовать что-то вроде d[Y,x] = ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...