使用 pyodbc 从 Access 中删除行时遇到问题

问题描述

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

我从表中读取没有问题,向它写入新值也没有问题。但是,我似乎无法从表中删除记录。我想删除“asof”值等于变量“reportdate”的所有记录,该变量是报告日期的熊猫时间戳。这个月是 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 语句的变体,但每次我要么得到那个错误,要么代码运行良好但没有从表中删除。任何见解都会很棒,谢谢。

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

解决方法

用八字 (reportdate) 分隔 # 值,以便 Access 数据库引擎将其识别为日期/时间值:

r"DELETE FROM ulrs WHERE asof = #{}#".format(reportdate))
,

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

注意 cursor.execute 中第二个参数的使用。下面假设 reportdate 是 Python 日期/时间变量。

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