我应该在python MySQLdb模块中重用光标吗

发布于 2021-01-29 16:55:47

我正在编写一个将查询MySQL数据库的python CGI脚本。我正在使用MySQLdb模块。由于数据库将被反复查询,因此我编写了此函数。

def getDatabaseResult(sqlQuery,connectioninfohere):
    # connect to the database
    vDatabase = MySQLdb.connect(connectioninfohere)
    # create a cursor, execute and SQL statement and get the result as a tuple
    cursor = vDatabase.cursor()
    try:
        cursor.execute(sqlQuery)
    except:
        cursor.close()
        return None
    result = cursor.fetchall()
    cursor.close()
    return result

我的问题是…这是最佳做法吗?我应该在函数中重用光标吗?例如。哪个更好…

def callsANewCursorAndConnectionEachTime():
    result1 = getDatabaseResult(someQuery1)
    result2 = getDatabaseResult(someQuery2)
    result3 = getDatabaseResult(someQuery3)
    result4 = getDatabaseResult(someQuery4)

或一起删除getDatabaseeResult函数,然后执行类似的操作。

def reusesTheSameCursor():
    vDatabase = MySQLdb.connect(connectionInfohere)
    cursor = vDatabase.cursor()

    cursor.execute(someQuery1)
    result1 = cursor.fetchall()

    cursor.execute(someQuery2)
    result2 = cursor.fetchall()

    cursor.execute(someQuery3)
    result3 = cursor.fetchall()

    cursor.execute(someQuery4)
    result4 = cursor.fetchall()
关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    MySQLdb开发人员建议构建一个特定于应用程序的API,该API可以为您提供数据库访问权限,这样您就不必担心应用程序代码中的mysql查询字符串。这将使代码更具可扩展性(link)。

    至于游标,我的理解是最好的事情是为每个操作/事务创建一个游标。因此,某种check value -> update value -> read value类型的事务可以使用相同的游标,但是对于下一个事务,您将创建一个新的游标。这再次指出了为数据库访问构建内部API的方向,而不是使用通用executeSql方法。

    还请记住关闭游标,并在查询完成后将更改提交到连接。

    但是,您的getDatabaseResult函数不需要为每个单独的查询都具有连接。只要您负责游标,就可以共享查询之间的连接。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看