我有一个具有唯一键的数据库表。如果我想插入一些记录,有两种可能的方法。首先,唯一项还不存在,没关系,只需返回新的id即可;其次,该项已经存在,我需要获取这个唯一记录的id。在
问题是,无论我尝试什么,总会有一些例外。在
下面是代码示例:
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 Connection not available”(MySQL连接不可用)、“Unread result”(未读结果)。代码只是示例来演示它。在
这是我第一个使用Connector/python的程序,所以我不知道所有关于获取结果、提交查询等规则。在
有人能帮我解决这个问题吗?或者有没有什么有效的方法来完成这项任务(因为这个对我来说似乎不是最好的解决办法)。谢谢你的建议。在
我无法修复您的代码,因为您给了我们两个不同版本的代码和两个部分描述的错误,但我可以告诉您如何开始。在
从评论中:
^{bq}$查看代码,您调用
fetchone
的唯一位置是:{{cd2>显然返回了None?根据the documentation.*
你想做的是:
^{pr2}$…就像所有的示例代码一样。在
为了将来的参考,如果您首先注意到错误发生在哪一行,而不是放弃回溯,然后将该行拆分为多个部分并记录中间值,那么调试这样的错误会容易得多。通常,你会发现一个不是你所期望的,问题在那一点上会更加明显,然后三步之后当你得到一个奇怪的异常。在
*从技术上讲,文档只是说
cursor.execute
的“返回值没有定义”,因此DB-API模块在这里返回self
是完全合法的。同样,当你调用一个方法的时候,返回一些对象来擦除你的硬盘也是合法的。在相关问题 更多 >
编程相关推荐