如何使用参数替换将日期列表作为VALUES传递到read_spl?

时间:2018-10-06 17:06:20

标签: python pandas sqlite

我有一个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的{​​{1}}参数,但是无法正常工作。有人可以告诉我如何吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以尝试

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 })

您可以参考Can jQuery change `$(window).width()`?