0
class MyAddon(pyxbmct.AddonDialogWindow):
    def __init__(self, title=''):
        super(MyAddon, self).__init__(title)
        self.mysql_connect()
        self.populate()

    def populate(self):
        categories = self.read_data()

    def read_data(self):
        query = ("SELECT category FROM test")
        cursor = connection.cursor()
        categories = cursor.execute(query)
        return categories

    def mysql_connect(self):
        global connection
        try:
            connection = mysql.connector.connect(**config).cursor()
        except mysql.connector.Error as err:
            if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
                xbmc.executebuiltin('Notification(Error!, Bad user name of password)')
            elif err.errno == errorcode.ER_BAD_DB_ERROR:
                xbmc.executebuiltin('Notification(Error!, Database does not exist)')
            else:
                xbmc.executebuiltin('Notification(Error!, {0})'.format(err))

我正在为 Kodi 开发 Python 插件。Global name 'connection' is not defined尝试使用全局变量进行数据库连接时出现错误。我无法从 read_data 函数读取全局变量连接。我确信这不是一个前向引用问题,因为我是这样测试的。

为连接使用全局变量的目的是在所有函数中重用连接,而无需每次都创建新连接。

4

1 回答 1

3

可能是 Kodi 对命名空间做了一些时髦的事情,或者您的实例被腌制了;未腌制时,全局将消失。像这样的全局变量的另一个问题是连接可能会在某个时候丢失。

我将重组代码以拥有一个返回连接的方法,并在所有需要连接的方法中使用它。使连接方法成为类方法并允许连接消失

class MyAddonConnectionFailed(Exception): pass

def read_data(self):
    query = ("SELECT category FROM test")
    try:
        conn = self.connect()
    except MyAddonConnectionFailed:
        # connection failed; error message already displayed
        return []
    cursor = conn.cursor()
    categories = cursor.execute(query)
    return categories

_connection = None

@classmethod
def connect(cls):
    if cls._connection and cls._connection.open:
        return cls._connection

    try:
        cls._connection = mysql.connector.connect(**config).cursor()
        return cls._connection
    except mysql.connector.Error as err:
        if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
            xbmc.executebuiltin('Notification(Error!, Bad user name of password)')
        elif err.errno == errorcode.ER_BAD_DB_ERROR:
            xbmc.executebuiltin('Notification(Error!, Database does not exist)')
        else:
            xbmc.executebuiltin('Notification(Error!, {0})'.format(err))
     raise MyAddonConnectionFailed

我在类方法中提出了一个异常connect;您需要决定如何处理数据库配置错误或无法连接的情况。显示错误消息是不够的。当然,您仍然可以self.connect()从该方法中调用__init__以尽早发出此问题的信号。

于 2016-04-06T08:22:41.850 回答