-1

我有一个带有唯一键的数据库表。如果我想插入一些记录,有两种可能的方法。首先,唯一的项目还不存在,没关系,只需返回新的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 连接不可用”、“未读结果”。该代码只是演示它的示例。

这是我第一个使用 Connector/python 的程序,所以我不知道所有的规则,比如获取结果、提交查询等等。

有人可以帮我解决这个问题吗?或者是否有任何有效的方法来完成这项任务(因为这对我来说似乎不是最好的解决方案)。谢谢你的任何建议。

4

1 回答 1

3

我无法修复你的代码,因为你给了我们两个不同版本的代码和两个部分描述的错误,但没有完整的信息,但我可以告诉你如何开始。

来自评论:

在以前的版本中,我猜是类型错误,类似于“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此处返回是完全合法的。再说一次,当您在其上调用方法时,返回一些擦除硬盘驱动器的对象也是合法的。

于 2013-08-17T00:06:02.673 回答