【问题标题】:Matching dates, both strings, don't 'match'?匹配日期,两个字符串,不“匹配”?
【发布时间】:2019-06-26 06:30:46
【问题描述】:

我正在尝试使用 IF 语句来触发 smtp 以触发电子邮件,但无论出于何种原因,我的匹配字符串都不会被解释为匹配项。

这是我正在使用的内容: 我正在导入我需要的所有内容并将“昨天”设置为字符串。

import csv, sqlite3
from datetime import date, timedelta

today = date.today()
yesterday = today - timedelta(days = 1)
yesterday = str(yesterday)

我构建了一个抓取工具来从各个站点抓取工作并将它们放到一个 csv 文件中。然后,我将遍历我的 csv 文件并获取所有符合我的“技能”标准的行:

skills = ('ninja')
csv_data = csv.DictReader(open('jobs.csv'))

for row in csv_data:
    if skills in row.get('address', '').lower():
        print("match")
        print(row['day'])
        print(type(row['day']))
        print(yesterday)
        print(type(yesterday))
        cur.execute("INSERT INTO jobs_table(day, 
                                            link,  
                                            description,  
                                            compensation,  
                                            employment_type, 
                                            images,  
                                            address) 
                                           VALUES(:day, 
                                                  :link,  
                                                  :description,   
                                                  :compensation,   
                                                  :employment_type,   
                                                  :images,   
                                                  :address)", row,) 
db.commit()

所有这些都可以正常工作,并将作业上传到我的数据库。 “打印”的输出给了我:

match
2019-06-14
<class 'str'>
2019-06-25
<class 'str'>
match
2019-06-25
<class 'str'>
2019-06-25
<class 'str'>
match
2019-06-25
<class 'str'>
2019-06-25
<class 'str'>

之后,它运行:

cur.execute(f"SELECT description, link 
              FROM jobs_table WHERE day = {yesterday}")

results = cur.fetchall()
if results:
    for result in results:
        result = str(result)
        result = result.replace("'",'')
        result = result.replace('(','')
        result = result.replace(')','')
        send_email(result)
else:
    print('No Results In The Database')
print('')        
print('')

db.close()

然后打印出来:

No Results In The Database

我不明白,因为如上所述,我的数据库的“日期”和日期时间的“昨天”都是匹配的字符串。

有人知道这里会发生什么吗?

【问题讨论】:

  • yesterday 看起来像2019-06-14,对吧?另一个试图将值直接放入语句而不是将它们绑定到参数的受害者......

标签: python-3.x string sqlite datetime


【解决方案1】:

我不会使用 f 字符串来插入日期,而是这样做:

cur.execute(
    "SELECT description, link FROM jobs_table WHERE day = :day",
    {
        "day": yesterday
    }
)

参数化将确保它在 SQL 中被正确引用,并且还使您免于许多其他潜在的转义和数据质量事故。

在执行命令中使用参数的一些例子可以在这里找到:https://docs.python.org/3/library/sqlite3.html#cursor-objects

【讨论】:

  • 做到了!感谢您的解决方案!
【解决方案2】:

我制作了自己的测试应用程序,并在其中连接到数据库。 以下代码打印正确,并且正在编写以匹配您的代码。

cur.execute("SELECT description, link FROM jobs_table WHERE day=" + yesterday)
results = cur.fetchall()
if results:
    print("true")
else:
    print("false")

在您的(昨天)值上使用“strftime”,并将数据库中的(天)更改为 varchar。

yesterday = date.today() - timedelta(days=1)
yesterday.strftime('%Y%m%d')

'20190625'

【讨论】:

    【解决方案3】:

    你可以试试

    cur.execute("SELECT description, link 
                          FROM jobs_table WHERE DATE(day) = DATE({yesterday})")
    

    而不是

    cur.execute(f"SELECT description, link 
                          FROM jobs_table WHERE day = {yesterday}")
    

    日期类型列中的时间可能不同。

    【讨论】:

    • 值得一试,但它并没有改变输出。\
    猜你喜欢
    • 2019-12-01
    • 2019-12-30
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2014-08-05
    • 1970-01-01
    相关资源
    最近更新 更多