这是代码产生错误:
import mysql.connector
import datetime
class Command:
def __init__(self):
mydb = mysql.connector.connect(host='localhost', passwd='1234', user='root', database='customers')
self.mycursor = mydb.cursor()
def execute(self, contest_id, url, Questions):
date = datetime.date.today()
Time = datetime.datetime.now().strftime("%I:%M")
self.mycursor.execute(f"INSERT INTO contest(contest_name, url_tag, Questions, At_date, At_time) VALUES('{contest_id}', '{url}', {Questions}, '{date}', '{Time}')")
我正在运行 Python 代码,但收到以下错误消息:
Traceback (most recent call last):
File "C:\python39\lib\site-packages\mysql\connector\cursor.py", line 518, in execute
if not self._connection:
ReferenceError: weakly-referenced object no longer exists Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
我的猜测是您的连接丢失了,因为它不属于您的班级。你能尝试一下这个方法吗?
import mysql.connector import datetime class Command: def __init__(self): self.conn = mysql.connector.connect(host='localhost', passwd='1234', user='root', database='customers') self.mycursor = self.conn.cursor() def execute(self, contest_id, url, Questions): date = datetime.date.today() Time = datetime.datetime.now().strftime("%I:%M") self.mycursor.execute(f"INSERT INTO contest(contest_name, url_tag, Questions, At_date, At_time) VALUES('{contest_id}', '{url}', {Questions}, '{date}', '{Time}')")在你的代码中,mydb 数据库连接对象是在 Command 类的 __init__ 方法中创建的。然而,这个连接对象并没有作为类的属性保存下来,因此当 __init__ 方法执行完毕后,mydb 对象就可能会被 Python 的垃圾回收器回收,因为它不再被任何变量引用。
为了解决这个问题,你需要将数据库连接对象 mydb 保存为类的一个属性,这样它就不会在 __init__ 方法执行完毕后被回收了。你可以通过在 self 上设置一个属性来实现这一点,比如 self.mydb。
import mysql.connector import datetime class Command: def __init__(self): self.mydb = mysql.connector.connect(host='localhost', passwd='1234', user='root', database='customers') self.mycursor = self.mydb.cursor() def execute(self, contest_id, url, questions): date = datetime.date.today() time = datetime.datetime.now().strftime("%H:%M") # 使用 24 小时制可能更为普遍 # 使用参数化查询以防止 SQL 注入攻击 query = "INSERT INTO contest (contest_name, url_tag, Questions, At_date, At_time) VALUES (%s, %s, %s, %s, %s)" values = (contest_id, url, questions, date, time) try: self.mycursor.execute(query, values) self.mydb.commit() # 提交事务以确保数据被保存到数据库 except mysql.connector.Error as err: print(f"Error: {err}") self.mydb.rollback() # 回滚事务以防止部分数据写入