Pygame对接AWS RDS时报Database类无scoreDB属性错误如何解决
问题修复方案
错误根本原因
- 错误使用类/静态方法装饰器:
scoreDB是Database类的实例属性,仅在实例化(执行__init__方法)后才会被创建。你给getScores加了@classmethod装饰器,类方法接收的第一个参数是类本身而非实例,自然访问不到仅实例才有的scoreDB属性。其余加了@staticmethod的方法也存在相同问题,静态方法默认不接收实例参数,无法访问实例属性。 - SQL占位符不兼容:pymysql使用
%s作为参数占位符,你代码中写的?是sqlite的占位符,后续执行插入/删除操作时会触发SQL语法错误。 - 调用方式不统一:你提供的
shooting_game.py里是先实例化再调用方法,但报错日志里显示的是直接用类名Database.getScores()调用类方法,完全没有实例化步骤,也会导致属性找不到。
具体修复步骤
1. 修正database.py代码
删除所有错误的装饰器,替换占位符,完整修正后的代码如下:
import pymysql class Database(object): numScores = 15 def __init__(self,host='database-1.c79ahye2go7m.ap-northeast-2.rds.amazonaws.com',user='admin',password='letskirin',db='hiScores',charset='utf8'): self.scoreDB=pymysql.connect(host=host,user=user,password=password,db=db,charset=charset) self.cursor=self.scoreDB.cursor(pymysql.cursors.DictCursor) # 去掉@staticmethod,改为普通实例方法 def getSound(self,music=False): curs = self.scoreDB.cursor(pymysql.cursors.DictCursor) if music: curs.execute("CREATE TABLE if not exists music (setting integer)") curs.execute("SELECT * FROM music") else: curs.execute("CREATE TABLE if not exists sound (setting integer)") curs.execute("SELECT * FROM sound") self.scoreDB.commit() setting = curs.fetchall() curs.close() return bool(setting[0][0]) if len(setting) > 0 else False # 去掉@staticmethod,改为普通实例方法,替换?为%s def setSound(self,setting, music=False): curs = self.scoreDB.cursor() if music: curs.execute("DELETE FROM music") curs.execute("INSERT INTO music VALUES (%s)", (setting,)) else: curs.execute("DELETE FROM sound") curs.execute("INSERT INTO sound VALUES (%s)", (setting,)) self.scoreDB.commit() curs.close() # 去掉@classmethod,改为普通实例方法 def getScores(self): curs = self.scoreDB.cursor() curs.execute('''CREATE TABLE if not exists scores (name text, score integer, accuracy real)''') curs.execute("SELECT * FROM scores ORDER BY score DESC") self.scoreDB.commit() hiScores = curs.fetchall() curs.close() return hiScores # 去掉@staticmethod,改为普通实例方法,替换?为%s def setScore(self,hiScores,entry): curs = self.scoreDB.cursor() if len(hiScores) == Database.numScores: lowScoreName = hiScores[-1][0] lowScore = hiScores[-1][1] curs.execute("DELETE FROM scores WHERE (name = %s AND score = %s)", (lowScoreName, lowScore)) curs.execute("INSERT INTO scores VALUES (%s,%s,%s)", entry) self.scoreDB.commit() curs.close()
2. 统一调用方式
确保所有Database类的方法调用都先实例化,不要直接用类名调用:
# 正确写法:先实例化再调用 db = Database() hiScores = db.getScores() # 错误写法:直接类调用,不会触发__init__初始化scoreDB # hiScores = Database.getScores()
内容的提问来源于stack exchange,提问作者Jiyoon
相关产品推荐
相关产品推荐

