如何用Python 3通过字典更新Access数据库INFO表的usage列
问题描述
需要更新Access数据库中INFO表的usage列,通过匹配ID列与Python字典的键,将对应字典值更新到usage列。现有代码运行报错,提示字典的keys()和values()方法不接受参数,请求修正代码实现功能。
原代码:
import pyodbc as pyo import pandas as pd import numpy as np conn_str= (r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};"r"DBQ=C:\database.mdb") conn=pyo.connect(conn_str) crsr=conn.cursor() #code to get list of all IDs from table in database Custinfo_ = np.array([row for row in crsr.execute('select ID from INFO')]).flatten() #dictionary of ID's to be updated. dict={"cus1":3, "cus2":4} for i in range (0, len(Custinfo_)): sql= f"UPDATE INFO SET Usage = '{dict.values(i)}' WHERE ID ={dict.keys(i)}" crsr.execute(sql) crsr.commit() crsr.close() conn.close()
修正方案
错误原因
原代码核心问题:
- 字典的
keys()、values()方法无需传参,它们返回键/值的视图对象,不能通过索引直接访问 - 循环逻辑冗余:遍历数据库所有ID毫无意义,应直接针对需要更新的字典键值对操作
修正后的代码
import pyodbc as pyo # 数据库连接字符串 conn_str = r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\database.mdb" conn = pyo.connect(conn_str) crsr = conn.cursor() # 需要更新的ID与对应usage值的字典 update_dict = {"cus1": 3, "cus2": 4} # 遍历字典键值对执行更新 for cust_id, usage_value in update_dict.items(): # 参数化查询:避免SQL注入,自动处理数据类型 sql = "UPDATE INFO SET Usage = ? WHERE ID = ?" crsr.execute(sql, (usage_value, cust_id)) # 提交事务并关闭连接 crsr.commit() crsr.close() conn.close()
关键改进点
- 直接用
items()遍历字典,获取待更新的ID和对应值,无需处理无关ID - 使用参数化查询:规避SQL注入风险,同时省去手动处理数据类型的麻烦(比如数字无需加单引号)
- 移除不必要的
pandas、numpy依赖,简化代码 - 变量名从
dict改为update_dict,避免覆盖Python内置的dict类型
内容的提问来源于stack exchange,提问作者Udeh Ebenezer Ifechukwu
相关产品推荐
相关产品推荐

