两个字符串都匹配的日期,不是“匹配”吗?

时间:2019-06-26 06:30:46

标签: python-3.x string sqlite datetime

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

这就是我正在处理的内容: 我正在导入所需的所有内容,并将“昨天”设置为字符串。

describe '#find_part_id' do
  before do
    allow(STDIN.gets).to receive(:chomp).and_return(stdin_input)
  end

  let(:stdin_input) { 'user input from stdin' }
  let(:face) { create(:face) }

  subject { described_class.find_part_id(face) }

  context 'When bab con already exists' do
    context 'when there are more than one part ids' do
      it 'some test' do
        # your test here
      end
    end

    # more contexts...

    context 'a context that needs a different stdin_input' do 
      let(:stdin_input) { 'some different user input from stdin' }

      it 'another test' do
        # your test here
      end
    end
  end
end

我构建了一个刮板,以从各个站点抓取作业并将其拖放到csv文件中。然后,我要遍历我的csv文件并抓取所有符合“技能”条件的行:

import csv, sqlite3
from datetime import date, timedelta

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

我不是使用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

答案 1 :(得分:1)

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

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'

答案 2 :(得分:0)

您可以尝试

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

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