Rumah > Soal Jawab > teks badan
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粉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}')")
大鹏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() # 回滚事务以防止部分数据写入