Managing a database connection with a global,全局名称消失
Managing a database connection with a global, global name disappears
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 函数读取全局变量连接。我确定这不是前向引用问题,因为我是这样测试的。
对连接使用全局变量的目的是为了在所有函数中重复使用连接,而不是每次都创建一个新连接。
可能是 Kodi 对命名空间做了一些奇怪的事情,或者您的实例被 pickle 了;未腌制时,全球将消失。像这样的全局的另一个问题是连接可能会在某个时候丢失。
我将重组代码以具有一个 returns 连接的方法,并在所有需要连接的方法中使用它。将连接方法设为类方法并允许连接消失:
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
类方法中提出异常;您需要决定如何处理数据库配置错误或无法连接的情况。显示错误消息是不够的。当然,您 可以 仍然从 __init__
方法调用 self.connect()
以尽早发出此问题信号。
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 函数读取全局变量连接。我确定这不是前向引用问题,因为我是这样测试的。
对连接使用全局变量的目的是为了在所有函数中重复使用连接,而不是每次都创建一个新连接。
可能是 Kodi 对命名空间做了一些奇怪的事情,或者您的实例被 pickle 了;未腌制时,全球将消失。像这样的全局的另一个问题是连接可能会在某个时候丢失。
我将重组代码以具有一个 returns 连接的方法,并在所有需要连接的方法中使用它。将连接方法设为类方法并允许连接消失:
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
类方法中提出异常;您需要决定如何处理数据库配置错误或无法连接的情况。显示错误消息是不够的。当然,您 可以 仍然从 __init__
方法调用 self.connect()
以尽早发出此问题信号。