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

pytest数据库单元测试pyodbc参数不匹配与Logger属性错误求解

报错原因及修改方案

1 pyodbc参数数量不匹配错误

错误原因

  • 你的INSERT语句stage_query仅包含2个参数占位符,但传入的data是多组(FreqId, Title)组成的列表,直接传给execute方法会被拆分为单个参数,最终参数数量和占位符数量不匹配
  • merge_query没有任何参数占位符,调用execute时多余传入data也会触发参数校验错误
  • 额外问题:你提供的fixture中数据库连接字符串拼接错误,用了.分隔参数,应该用;分隔,否则会连接数据库失败

修改方案

  • 批量插入多组数据时,替换execute为executemany方法
  • 执行merge_query时不要传入data参数
  • 修复fixture中的数据库连接字符串拼接错误
  • 建议补充事务提交、插入staging表前先执行清空操作避免旧数据干扰

修改后的业务代码:

def write_frequency_data(self, data):
    stage_query = "INSERT INTO staging_db.Frequency (FreqId, Title) VALUES (?,?)"
    merge_query = """INSERT INTO mykiosk.Frequency(FreqId, Title)
        SELECT FreqId, Title
        FROM staging_db.Frequency stage
        WHERE stage.FreqId not in (Select FreqId from mykiosk.Frequency)"""
    truncate_query = "TRUNCATE TABLE staging_db.Frequency"

    try:
        # 先清空staging表避免旧数据干扰
        self.cursor.execute(truncate_query)
        # 批量插入多组数据用executemany
        self.cursor.executemany(stage_query,data)
        # merge查询无参数,不需要传data
        self.cursor.execute(merge_query)
        # 提交事务保证数据写入生效
        self.cursor.commit()
    except pyodbc.Error as e:
        # 日志方法首字母小写
        logger.exception(e)

修改后的fixture连接代码:

# 把拼接用的.替换为;分隔连接参数
conn = pyodbc.connect("DRIVER={SQL Server};SERVER="+server+";DATABASE="+database+";UID="+username+";PWD="+password)

2 Logger属性不存在错误

错误原因

Python标准logging模块的异常日志方法名为全小写的exception,你代码中写为大写开头的Exception,调用不存在的属性触发报错。

修改方案

将logger.Exception(e)改为logger.exception(e)即可。


内容的提问来源于stack exchange,提问作者tp_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:18:03