Читать несколько списков из Python в SQL-запрос - PullRequest
0 голосов
/ 22 мая 2019

У меня есть 3 списка идентификаторов пользователей и диапазоны времени (разные для каждого идентификатора пользователя), для которых я хотел бы извлечь данные.Я запрашиваю базу данных красного смещения AWS через Python.Обычно с одним списком я бы сделал что-то вроде этого:

sql_query = "select userid from some_table where userid in {}".format(list_of_users)

, где список пользователей - это список идентификаторов пользователей, которые я хочу - скажем, (1,2,3 ...)

Это работает нормально, но теперь мне нужно как-то передать его по триплету (идентификатор пользователя, ограничение по времени, ограничение по времени).Например, ((1, '2018-01-01', '2018-01-14'), (2, '2018-12-23', '2018-12-25'), ...

Я пробовал разные версии этого базового запроса

sql_query = "select userid from some_table where userid in {} and date between {} and {}".format(list_of_users, list_of_dates_lower_bound, list_of_dates_upper_bound)

, но как бы я ни структурировал списки в формате (), он не работает. Я не уверен, что это возможно даже таким образом илиесли мне нужно просто перебрать списки и повторно вызывать запрос для каждого триплета?

Ответы [ 2 ]

1 голос
/ 22 мая 2019

предположим, что список значений выглядит примерно так:

list_of_users = [1,2], 
list_of_dates_lower_bound = ['2018-01-01', '2018-12-23']
list_of_dates_lower_bound = ['2018-01-14', '2018-12-25']

форматированный sql будет:

select userid from some_table where userid in [1,2] and date between ['2018-01-01', '2018-12-23'] and ['2018-01-14', '2018-12-25']

Этот результат не должен быть таким, как вы думали, это просто недопустимый sql, операнд between должен быть скалярным значением.

Я предлагаю перебрать списки и передать одно значение заполнителю.

0 голосов
/ 22 мая 2019

Вы можете выбрать в пределах определенного диапазона, используя

select col from table where col between range and range;

В вашем случае это может быть

select userid from some_table where date_from between yesterday and today;

или даже

select userid from some_table where date_from >= yesterday and date_from <= today;
...