Python-在MySQL陈述式中使用.format()字串

Mic*_*air 1 python mysql string.format

我正在尝试使用今天的数据以及7天前的数据格式化mysql语句。我很确定日期格式正确,所以我认为不是问题所在。

错误报告是:

 Warning: (1292, "Incorrect datetime value: '{} 16:00:00' for column 'run_start_date' at row 1")
      result = self._query(query)
    Traceback (most recent call last):
         AttributeError: 'int' object has no attribute 'format'
Run Code Online (Sandbox Code Playgroud)

例如

today = DT.date.today()
week_ago = today - DT.timedelta(days=7)
print(today.strftime('%Y-%m-%d'))
print(week_ago.strftime('%Y-%m-%d'))

cursor.execute(SELECT * FROM db WHERE run_start_date BETWEEN '{} 16:00:00' AND '{} 16:00:00'format(week_ago, today)
Run Code Online (Sandbox Code Playgroud)

ale*_*nes 5

使用准备好的语句(安全方式):

qry = """
    SELECT *
    FROM db
    WHERE run_start_date BETWEEN '%s 16:00:00' AND '%s 16:00:00'
""" # 

today = DT.date.today()
week_ago = today - DT.timedelta(days=7)
today = str(today.strftime('%Y-%m-%d'))  # Convert to string
week_ago = str(week_ago.strftime('%Y-%m-%d'))  # Convert to string

cursor.execute(qry, [today, week_ago])
Run Code Online (Sandbox Code Playgroud)

使用.format()会使您有遭受SQL注入的风险(如果将用户输入传递给.format()例如)

qry = """
    SELECT *
    FROM db
    WHERE run_start_date BETWEEN '{today} 16:00:00' AND '{week_ago} 16:00:00'
""" # Use named placeholders, nicer to read, prevents you having to repeat variables multiple time when calling .format()

today = DT.date.today()
week_ago = today - DT.timedelta(days=7)
today = str(today.strftime('%Y-%m-%d'))  # Convert to string
week_ago = str(week_ago.strftime('%Y-%m-%d'))  # Convert to string

qry = qry.format(today=today, week_ago=week_ago)
cursor.execute(qry)
Run Code Online (Sandbox Code Playgroud)

  • 当有人独自一人访问该网站并将其粘贴到用户输入的示例中时,就会发生这种情况。除了显示为什么这是一个坏习惯外,没有充分的理由来教导这样的坏习惯。 (2认同)
  • 您是对的,非常感谢您的输入,没有考虑其他用户可能会复制答案的事实。高五兄弟/ sis! (2认同)
  • @Shadow-您做得很好,队友们,干杯! (2认同)