cari

Rumah  >  Soal Jawab  >  teks badan

#->Ralat pengecualian: Objek rujukan yang lemah tidak lagi wujud

Ini adalah kod yang menghasilkan ralat:

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

Saya menjalankan kod Python tetapi saya mendapat mesej ralat berikut:

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粉070918777244 hari yang lalu399

membalas semua(2)saya akan balas

  • P粉329425839

    P粉3294258392024-03-27 10:03:31

    Tekaan saya ialah sambungan anda terputus kerana ia bukan milik kelas anda. Bolehkah anda mencuba kaedah ini?

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

    balas
    0
  • 大鹏

    大鹏2024-03-27 11:06:29

    Dalam kod anda, objek sambungan pangkalan data mydb dicipta dalam kaedah __init__ kelas Perintah. Walau bagaimanapun, objek sambungan ini tidak disimpan sebagai atribut kelas, jadi apabila kaedah __init__ selesai, objek mydb mungkin dikitar semula oleh pengumpul sampah Python kerana ia tidak lagi dirujuk oleh mana-mana pembolehubah.

    Untuk menyelesaikan masalah ini, anda perlu menyimpan objek sambungan pangkalan data mydb sebagai atribut kelas supaya ia tidak akan dikitar semula selepas kaedah __init__ dilaksanakan. Anda boleh melakukan ini dengan menetapkan sifat pada diri sendiri, seperti 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()  # 回滚事务以防止部分数据写入

    balas
    0
  • Batalbalas