You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:12:47