У меня есть база данных sqlite, и есть таблица с именем cached_dates
, в которой просто есть строка для каждой даты, где дата имеет тип text
и выглядит как YYYY-MM-DD
.
У меня также естьсписок дат в том же строковом формате, и я хочу знать, какие даты в этой последней нет в таблице cached_dates
.
Я не могу понять, как закодировать строку таким образом, чтобы я могпередать его в функцию pandas read_sql
, используя подстановку параметров.
Я могу сделать это, используя форматирование строки, но я знаю, что он подвержен атакам с использованием инъекций, поэтому я хотел бы сделать это правильно, но я могу понять синтаксис.Вот что я делаю сейчас:
Создайте таблицу:
CREATE TABLE IF NOT EXISTS cached_dates (date text NOT NULL PRIMARY KEY);
Вставьте что-нибудь в таблицу:
insert into cached_dates values('2018-01-03');
Это запрос, который я хочу сделать:
SELECT *
FROM
(
VALUES('2018-01-01'),('2018-01-02'),('2018-01-03'),('2018-01-04'),('2018-01-05')
)
EXCEPT
SELECT date FROM cached_dates;
Это код Python, который я использую:
date_list = ['2018-01-01','2018-01-02','2018-01-03','2018-01-04','2018-01-05']
# Convert to string that can be passed to VALUES
dates_str = ''
for date in date_list:
dates_str = dates_str + "('{}'),".format(date)
dates_str = dates_str[:-1]
sql = ( 'SELECT * '
'FROM '
'('
'VALUES {}'
') '
'EXCEPT '
'SELECT date FROM cached_dates;').format(dates_str)
df = pd.read_sql(sql, self._conn)
Я хотел бы использовать params
параметр read_sql
, но я не мог заставить это работать.Может кто-нибудь, пожалуйста, покажите мне, как?
Спасибо!