#->Ralat pengecualian: Objek rujukan yang lemah tidak lagi wujud
P粉070918777
P粉070918777 2024-03-26 11:19:01
0
2
394

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

membalas semua(2)
P粉329425839

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

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan