我应该重新使用游标对象还是使用 mysql.connector 创建一个新对象?

Posted

技术标签:

【中文标题】我应该重新使用游标对象还是使用 mysql.connector 创建一个新对象?【英文标题】:Should I re-use cursor object or create a new one with mysql.connector? 【发布时间】:2019-09-23 01:05:04 【问题描述】:

我应该重复使用游标对象还是为每个查询创建一个新的对象?

重用光标:

    # we're going to connect to s3 and mysql
    db = mysql_connect(host="localhost",
                       user="user",
                       passwd="pass",
                       database="db")

    # Reusing the cursor
    cursor = db.cursor()

    # loop through all the files in the bucket one by one
    for key in bucket.get_all_keys():

        # the document id is the filename in the s3 bucket
        doc_id = key.name.split("/")[-1]
        cursor.execute("SELECT document_name FROM laws_docs WHERE id = %i", (doc_id,))
        doc_name = cursor.fetchone()[0]

    cursor.close()

- 或 -

每次新光标:

    # we're going to connect to s3 and mysql
    db =  mysql_connect(host="localhost",
                       user="user",
                       passwd="pass",
                       database="db")

    # loop through all the files in the bucket one by one
    for key in bucket.get_all_keys():

        # new cursor
        cursor = db.cursor()

        # the document id is the filename in the s3 bucket
        doc_id = key.name.split("/")[-1]
        cursor.execute("SELECT document_name FROM laws_docs WHERE id = %i", (doc_id,))
        doc_name = cursor.fetchone()[0]

         ursor.close()

这还重要吗?该循环将至少运行 50,000 次。

【问题讨论】:

【参考方案1】:

如果您使用的是MySQL Connector/Python,cursor = db.cursor() 将创建一个新的CMySQLCursor 实例(如果您使用的是纯 Python 版本,则为 MySQLCursor)。因此,对于您的第二个示例,您将创建 50,000 个游标实例。

您只需要一个光标。在for 循环之外打开和关闭光标(使用您的第一个示例)。

【讨论】:

以上是关于我应该重新使用游标对象还是使用 mysql.connector 创建一个新对象?的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL 和 MongoDB 游标

游标中定义的查询执行多少次?

pymongo - 使用自定义游标类

如何保留 $in 查询的游标顺序? [复制]

如何保留 $in 查询的游标顺序? [复制]

何时使用 MySQLdb 关闭游标