#->Erreur d'exception : l'objet de référence faible n'existe plus
P粉070918777
P粉070918777 2024-03-26 11:19:01
0
2
453

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粉070918777
P粉070918777

répondre à tous(2)
P粉329425839

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}')")
大鹏

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()  # 回滚事务以防止部分数据写入

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal