Python操作MySQL插入数据报TypeError: 'int' object is not callable
问题根因
这个报错和你的MySQL操作、numpy随机数生成逻辑没有任何关系,属于典型的Jupyter环境变量污染问题:
- 从报错回溯可以看到,异常触发在
n0 = ['Player ' + str(i) for i in range(3)]这行的str(i)调用处。 - 出现这个错误的唯一原因是:你在同一个Notebook里之前运行的代码,曾经给内置函数名
str赋过整数值,比如写过类似str = 234的测试代码,把原本用来做类型转换的内置str()函数覆盖成了int类型的变量。此时再写str(i),Python解释器会找到你之前定义的那个整数变量,尝试把整数当函数调用,自然抛出'int' object is not callable的错误。 - 你可以做个简单验证:把当前这段代码存成独立的
.py文件用Python直接运行,完全不会触发这个报错,就能证明问题出在Notebook留存的历史变量上。
另外你的代码还有个非报错类的小问题:把db.commit()写在for循环里,每插一条数据就提交一次事务,执行效率很低,属于不必要的开销。
修复方案
根据你的需求二选一即可解决报错:
- 方案1(最彻底):直接重启当前Jupyter Notebook的内核,清空所有历史运行留存的自定义变量,再重新运行代码即可正常执行。
- 方案2(不想重启内核):在这段代码的最开头加一行
del str,手动删掉你之前错误赋值的str变量,解释器会自动找回内置的str函数。
可选优化点:
- 写INSERT语句的时候建议明确指定要插入的字段名,避免后续表结构调整字段顺序变了导致插错数据,比如把SQL改成
INSERT INTO information (username, password) VALUES(%s,%s); - 把
db.commit()移到for循环外部,等所有插入语句执行完成后统一提交一次事务,提升运行效率。 - 所有数据库操作完成后记得关闭游标和数据库连接,避免资源泄露。
修复后的完整参考代码:
import mysql.connector import numpy as np # 若选择不重启内核,取消下面这行的注释 # del str db = mysql.connector.connect( host='localhost', user='root', password='######', database='python_database' ) cursor = db.cursor() # 明确指定插入字段 syntax = "INSERT INTO information (username, password) VALUES(%s,%s);" n0 = ['Player ' + str(i) for i in range(3)] n1 = [p for p in np.random.randint(1, 1000, 3)] for i in range(3): values = (n0[i], int(n1[i])) cursor.execute(syntax, values) # 所有操作完成后统一提交事务 db.commit() # 关闭资源 cursor.close() db.close()
写代码时注意不要用
str、int、list、range、dict这类Python内置的函数/类名作为自定义变量名,这是新手非常容易踩的坑,会直接覆盖内置逻辑触发各类难以排查的报错。
内容的提问来源于stack exchange,提问作者Pythonic User
相关产品推荐
相关产品推荐

