插入后选择连接器/python
我有一个具有唯一键的数据库表。如果我想插入一些记录,有两种可能的方法。首先,唯一项还不存在,没关系,只需返回新id。其次,该项已经存在,我需要获取此唯一记录的id 问题是,无论我尝试什么,总会有例外 下面是代码示例:插入后选择连接器/python,python,mysql,mysql-connector,python-3.3,Python,Mysql,Mysql Connector,Python 3.3,我有一个具有唯一键的数据库表。如果我想插入一些记录,有两种可能的方法。首先,唯一项还不存在,没关系,只需返回新id。其次,该项已经存在,我需要获取此唯一记录的id 问题是,无论我尝试什么,总会有例外 下面是代码示例: def __init__(self, host, user, password, database): # set basic attributes super().__init__(host, user, password, database) #ope
def __init__(self, host, user, password, database):
# set basic attributes
super().__init__(host, user, password, database)
#open connection
try:
self.__cnx = mysql.connector.connect(
database=database, user=user, password=password, host = host)
#self.__cursor = self.__cnx.cursor()
except ...
def insert_domain(self, domain):
insertq = "INSERT INTO `sp_domains` (`domain`) VALUES ('{0}')".format(domain)
cursor = self.__cnx.cursor()
try:
cursor.execute(insertq)
print("unique")
except (mysql.connector.errors.IntegrityError) as err:
self.__cnx.commit()
print("duplicate")
s = "SELECT `domain_id` FROM `sp_domains` WHERE `domain` = '{0}';".format(domain)
try:
id = cursor.execute(s).fetchone()[0]
except AttributeError as err:
print("Unable to execute the query:", err, file=sys.stderr)
except mysql.connector.errors.ProgrammingError as err:
print("Query syntax error:", err, file=sys.stderr)
else:
self.__cnx.commit()
cursor.close()
但不管我做了什么,在第一个重复记录上,我都会得到“MySQL连接不可用”、“未读结果”。代码只是一个示例来演示它
这是我第一个使用Connector/python的程序,所以我不知道关于获取结果、提交查询等的所有规则
有人能帮我解决这个问题吗?或者有什么有效的方法来完成这项任务(因为这似乎不是我的最佳解决方案)。谢谢您的建议。我无法修复您的代码,因为您在没有完整信息的情况下为我们提供了两个不同版本的代码和两个部分描述的错误,但我可以告诉您如何开始 在评论中: 在以前的版本中,我猜是类型错误,类似于“NoneType没有属性'fetchone' 查看您的代码,您唯一调用
fetchone
的地方是:
id = cursor.execute(s).fetchone()[0]
很明显,cursor.execute(s)
返回了None
。它为什么返回None
?好吧,这就是它应该返回的,根据*
您要做的是:
cursor.execute(s)
id = cursor.fetchone()[0]
…就像所有示例代码一样
作为将来的参考,如果您首先注意到错误发生在哪一行,而不是放弃回溯,然后将该行拆分并记录中间值,那么调试这样的错误会容易得多。通常,您会发现一个错误与您预期的不符,此时问题会更加明显,因为三步之后,当你得到一个奇怪的异常
*从技术上讲,文档只是说“返回值没有定义”对于
cursor.execute
,DB-API模块在此处返回self
是完全合法的。再说一次,当你调用某个方法时,返回某个擦除你硬盘的对象也是合法的。你从哪里得到这个错误?它是作为属性错误
或编程错误
打印的,还是因为两者都不是而通过回溯引发的,或者…?它来自哪一行?好的,我已经编辑了代码,所以你可以看到连接正在建立。方法insert_domain()是循环调用的,它在重复项的第一次出现时就被压碎。现在它引发了mysql.connector.errors.OperationalError(“mysql连接不可用”)异常。在以前的版本中,我猜是类型错误,类似于“NoneType没有属性'fetchone'。我不确定我做了什么更改,我现在正在头脑风暴好吧,“NoneType没有属性'fetchone'“这是一个明显的问题。哦,天哪,我在完全错误的地方寻找问题。它解决了所有问题,属性错误被try-catch块捕获,所以游标/连接没有准备好进行另一个查询,这就是为什么我得到了MySQL-connection不可用的原因。我很抱歉投不完整,不明显的报告,谢谢你的帮助!