Как передать список дат как VALUES в read_spl, используя подстановку параметров? - PullRequest
0 голосов
/ 06 октября 2018

У меня есть база данных 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, но я не мог заставить это работать.Может кто-нибудь, пожалуйста, покажите мне, как?

Спасибо!

1 Ответ

0 голосов
/ 06 октября 2018

Вы можете попробовать это

sql = ( 'SELECT * '
        'FROM ' 
        '('
        'VALUES %(date_str)s'
        ') '
        'EXCEPT '
        'SELECT date FROM cached_dates;')

df = pd.read_sql(sql, self._conn, params = {"date_str" : dates_str })

Вы можете взять ссылку от здесь

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