You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:24:03