插入后连接器/ python选择

时间:2013-08-16 22:56:58

标签: python mysql mysql-connector python-3.3

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

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

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

1 个答案:

答案 0 :(得分:2)

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

来自评论:

  

在以前的版本中,我猜是类型错误,例如“NoneType没有属性'fetchone'。

查看您的代码,您拨打fetchone的唯一地点就在这里:

id = cursor.execute(s).fetchone()[0]

很明显,cursor.execute(s)返回None。为什么返回None?嗯,根据the documentation,这是它应该返回的。*

您想要做的是:

cursor.execute(s)
id = cursor.fetchone()[0]

...正如所有示例代码所做的那样。


为了将来参考,如果您首先记下它发生在哪一行而不是丢弃回溯,然后将该行分成几部分并记录中间值,那么调试这样的错误要容易得多。通常情况下,你会发现一个不符合你预期的问题,那时问题会更加明显,然后在你得到一个奇怪的例外后三步。


*从技术上讲,文档只是说cursor.execute的“返回值没有定义”,因此DB-API模块在这里返回self是完全合法的。再说一遍,当你调用一个方法时,返回一个擦除硬盘驱动器的对象也是合法的。