无法使用 pyodbc 从 Access 中删除行

Trouble deleting rows from Access with pyodbc

每个月我都必须根据同一组数据创建一份报告。我刚刚将所有这些信息迁移到 Access 中并更新了我的报告代码以从 Access tables 中读取数据,这是我的救星。但是,在报告结束时,我需要用本月的“ulr”值更新其中一个 table。为了安全起见,我希望代码永远不会读取本月的 ulr 值,在 运行ning 时删除 Access table 中存在的任何值,然后将本月的 ulr 添加到 table .这样,如果我不得不多次 运行 代码,它总是用最近的 运行 替换本月的值。 table 中的所有值都有一个“asof”字段,指示它们来自哪个报告月份,以简化此操作。

我从 table 读取没有问题,向它写入新值也没有问题。但是,我似乎无法从 table 中删除记录。我想删除所有“asof”值等于变量“reportdate”的记录,该变量是报告日期的 pandas 时间戳。这个月是 pd.Timestamp(2021,4,30).

ProgrammingError                          Traceback (most recent call last)
<ipython-input-36-c6e3188cf05f> in <module>
      6 cnxn = pyodbc.connect(connStr)
      7 crsr = cnxn.cursor()
----> 8 crsr.execute(
      9     r"DELETE FROM ulrs WHERE asof = {}".format(reportdate))
     10 cnxn.commit()

ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression '[asof]=2021-04-30 00:00:00'. (-3100) (SQLExecDirectW)")

我已经尝试了 delete 语句的变体,但每次我都遇到该错误,或​​者代码 运行 没问题,但没有从 table 中删除任何内容。任何见解都会很棒,谢谢。

#Delete all rows in ulrs Access table for the current month:    
connStr = (
        r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};"
        r"DBQ=%s;" % ('W:\Data for Reports\Act vs Exp Data\Program A v E\AvE Databases\ave_reference - Copy.accdb')
        )
cnxn = pyodbc.connect(connStr)
crsr = cnxn.cursor()
crsr.execute(
    r"DELETE FROM ulrs WHERE asof={}".format(reportdate))
cnxn.commit()

考虑参数化,除其他原因外,它可以更好地促进数据类型,而无需 任何 标点符号,例如引号或数字符号。 PyODBC 支持 parameters 和 qmarks。

注意 cursor.execute 中第二个参数的使用。下面假设 reportdate 是一个 Python date/time 变量。

crsr.execute("DELETE FROM ulrs WHERE asof = ?", reportdate)
cnxn.commit()