我正在编写一个将查询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 :(得分:18)
MySQLdb开发人员建议构建一个特定于应用程序的API,为您提供数据库访问权限,这样您就不必担心应用程序代码中的mysql查询字符串。它会使代码更具扩展性(link)。
对于游标,我的理解是最好的方法是为每个操作/事务创建一个游标。因此,某些check value -> update value -> read value
类型的事务可以使用相同的游标,但是对于下一个,您将创建一个新游标。这再次指出了为db访问构建内部API的方向,而不是使用通用的executeSql
方法。
还要记得关闭游标,并在查询完成后提交对连接的更改。
您的getDatabaseResult
函数不需要为每个单独的查询建立连接。只要您对游标负责,您就可以共享查询之间的连接。