在Python中参数化DELETE SQL语句时遇到问题

问题描述 投票:0回答:2

我正在编写Python3脚本来对付MySQL数据库。使用mysql.connector功能。

我正在尝试编写DELETE命令。我可以使它与静态字符串一起使用,但不能使其与参数化语句一起使用。

此作品:

sql = "DELETE FROM mytable where report_dt < '" + str(report_date) + "'"
try:
    mycursor.execute(sql)
    mydb.commit()

此失败:

sql = "DELETE FROM mytable where report_dt < '%s'"
try:
    mycursor.execute(sql, report_date)
    mydb.commit()

report_date var来自datetime.datetime.now(),其格式如下:

str(report_date)返回:‘​​2020-06-09 10:59:11’

没有错误消息……它实际上并没有删除它应该删除的行。

mysql sql python-3.x datetime delete-row
2个回答
0
投票
sql = "DELETE FROM mytable where report_dt < %s" try: mycursor.execute(sql, [report_date]) mydb.commit()

删除%s周围的单引号,并在report_date变量周围使用方括号。

单引号是静态文本条目时是必需的,但显然在参数化期间它的工作方式有所不同。

谢谢大家!


0
投票
sql = "DELETE FROM mytable WHERE report_dt < %(date)s;" try: mycursor.execute(sql, {'date': str(report_date)}) mydb.commit() except: print(f"Error deleting report from {report_date}.")

OR

sql = "DELETE FROM mytable WHERE report_dt < %s;"
try:
    mycursor.execute(sql, [str(report_date)])
    mydb.commit()
except:
    print(f"Error deleting report from {report_date}.")

Python PEP 249涵盖了数据库库为遵循Python的一致性而应遵循的API。

execute方法下:

参数可以作为序列或映射提供,并且将在操作中绑定到变量。

[通常,我总是尝试使用映射(例如dict),以便对SQL中的内容有所了解。特别是当我需要在多个地方重复相同的内容时。

我可以为仅包含一个或两个参数的简短查询编写序列(例如list

[如果您未严格遵循PEP 249,尽管在所使用的特定MySQL库中,但这可能会有所不同。例如,并非所有人都支持全部paramstyles

© www.soinside.com 2019 - 2024. All rights reserved.