Maison > Questions et réponses > le corps du texte
Voici le code qui produit l'erreur :
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}')")
J'exécute du code Python et je reçois le message d'erreur suivant :
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
P粉3294258392024-03-27 10:03:31
Je suppose que votre connexion est perdue car elle n'appartient pas à votre classe. Pouvez-vous essayer cette méthode ?
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}')")
大鹏2024-03-27 11:06:29
Dans votre code, l'objet de connexion à la base de données mydb est créé dans la méthode __init__ de la classe Command. Cependant, cet objet de connexion n'est pas enregistré en tant qu'attribut de la classe, donc lorsque la méthode __init__ se termine, l'objet mydb peut être recyclé par le garbage collector de Python car il n'est plus référencé par aucune variable.
Afin de résoudre ce problème, vous devez enregistrer l'objet de connexion à la base de données mydb en tant qu'attribut de la classe afin qu'il ne soit pas recyclé après l'exécution de la méthode __init__. Vous pouvez le faire en définissant une propriété sur self, telle que 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() # 回滚事务以防止部分数据写入