ins后的连接器/python选择

2024-05-14 11:13:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个具有唯一键的数据库表。如果我想插入一些记录,有两种可能的方法。首先,唯一项还不存在,没关系,只需返回新的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的程序,所以我不知道所有关于获取结果、提交查询等规则。在

有人能帮我解决这个问题吗?或者有没有什么有效的方法来完成这项任务(因为这个对我来说似乎不是最好的解决办法)。谢谢你的建议。在


Tags: selfidhostconnectordomainmysqlpasswordcursor
1条回答
网友
1楼 · 发布于 2024-05-14 11:13:54

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

从评论中:

^{bq}$

查看代码,您调用fetchone的唯一位置是:

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

{{cd2>显然返回了None?根据the documentation.*

你想做的是:

^{pr2}$

…就像所有的示例代码一样。在


为了将来的参考,如果您首先注意到错误发生在哪一行,而不是放弃回溯,然后将该行拆分为多个部分并记录中间值,那么调试这样的错误会容易得多。通常,你会发现一个不是你所期望的,问题在那一点上会更加明显,然后三步之后当你得到一个奇怪的异常。在


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

相关问题 更多 >

    热门问题