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_
相关产品推荐
相关产品推荐

