我有一个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}}参数,但是无法正常工作。有人可以告诉我如何吗?
谢谢!
答案 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 })