MySQL executemany无法批量执行列表数据的问题求助
问题排查与解决方案
核心问题:逻辑运算符误用
你的mysqlconnclass中dbwrite()和dbread()方法里的条件判断用了按位与运算符&,而非Python的逻辑与运算符and。&会先将布尔值转为整数再做位运算,导致判断逻辑失效,executemany分支根本没被触发。
修复步骤
1. 修正逻辑运算符与分支结构
把isinstance(data,list) & len(data) > 0替换为isinstance(data, list) and len(data) > 0,同时将并列的if改为elif,避免无效的分支判断,新增异常捕获与执行结果验证:
修改后的dbwrite()方法:
def dbwrite(self, query, data=None): execute = 0 data = data or [] try: if len(data) == 0: self.c.execute(query) elif isinstance(data, dict): self.c.execute(query, data) elif isinstance(data, list) and len(data) > 0: self.c.executemany(query, data) execute = 1 print(f"批量执行完成,影响行数:{self.c.rowcount}") self.connection.commit() except Exception as e: self.connection.rollback() print(f"数据库写入错误:{str(e)}")
修改后的dbread()方法:
def dbread(self, query, data=None): execute = 0 data = data or [] try: if len(data) == 0: self.c.execute(query) elif isinstance(data, dict): self.c.execute(query, data) elif isinstance(data, list) and len(data) > 0: self.c.executemany(query, data) execute = 1 if execute == 0: return self.c.fetchall() except Exception as e: print(f"数据库读取错误:{str(e)}") return []
2. 统一字段值类型
你的查询语句用current_sub = '1'(字符串),但更新时设为False(布尔值),MySQL会自动转换类型,可能导致匹配异常。根据tickers表current_sub字段的实际类型调整:
- 如果是
CHAR/VARCHAR/ENUM类型:更新语句改为SET current_sub = '0' - 如果是
BIT/TINYINT类型:查询语句改为WHERE current_sub = 1
3. 验证执行有效性
通过self.c.rowcount可以查看批量更新实际影响的行数,结合打印信息确认executemany是否真正执行,以及更新是否生效。
额外优化建议
- 避免使用可变参数默认值
data=[]:Python中可变默认参数会被多次调用共享,改为data=None后再初始化空列表(如上面代码所示)。 - 添加资源释放逻辑:在类中加入
__del__方法,确保对象销毁时关闭数据库连接和游标:
def __del__(self): if hasattr(self, 'c') and self.c: self.c.close() if hasattr(self, 'connection') and self.connection: self.connection.close()
内容的提问来源于stack exchange,提问作者Jordan Deville
相关产品推荐
相关产品推荐

