recherche

Maison  >  Questions et réponses  >  le corps du texte

#->Erreur d'exception : l'objet de référence faible n'existe plus

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粉070918777P粉070918777242 Il y a quelques jours397

répondre à tous(2)je répondrai

  • P粉329425839

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

    répondre
    0
  • 大鹏

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

    répondre
    0
  • Annulerrépondre