Python PostgreSQL/performance为每个查询创建一个通用游标或
我正在构建一个脚本来在数据库中存储一些数据。我第一次使用PostgeSQL时,一切都进展顺利,并按计划进行。我在想PostgreSQl中游标的用法,如果我做了很多,而一个就足够了怎么办。但是我不想把游标传递给我所有的SQL函数 下面是我的简化示例Python PostgreSQL/performance为每个查询创建一个通用游标或,python,postgresql,cursor,python-db-api,Python,Postgresql,Cursor,Python Db Api,我正在构建一个脚本来在数据库中存储一些数据。我第一次使用PostgeSQL时,一切都进展顺利,并按计划进行。我在想PostgreSQl中游标的用法,如果我做了很多,而一个就足够了怎么办。但是我不想把游标传递给我所有的SQL函数 下面是我的简化示例 dbConn, dbCurs = openDataBase(config) doSomeThing(dbCurs, name, age, listOfJohns) def doSomething(dbCurs, name, age, listOfPo
dbConn, dbCurs = openDataBase(config)
doSomeThing(dbCurs, name, age, listOfJohns)
def doSomething(dbCurs, name, age, listOfPoeple):
listOfPoeple SQLnrOfPeopleNamed(dbCurs, name, age)
#here some fine checking if there's a list
#room for more code. etc. etc.
def SQLnrOfPeopleNamed(dbCurs, inpName, inpAge)
dbCurs.execute(Some SQL-thingy)
#check and return result
dbCurs是传递给包含SQL查询的每个函数的值。现在,dbCurs非常特定于PostgreSQL。每当我将这个数据库更改为e.q.MySQL时,我都必须重写查询函数SQLnrOfPeople,以及与这些函数的接口
我希望有这样的情况,我只需要重写SQL函数的功能。所以,我想在每个SQL函数中创建一个游标类并关闭它。这将产生一个更通用的接口,其中只需要连接
dbConn = openDataBase(config)
doSomeThing(dbConn, name, age, listOfJohns)
def doSomething(dbConn, name, age, listOfPoeple):
listOfPoeple SQLnrOfPeopleNamed(dbConn, name, age)
#here some fine checking if there's a list
#room for more code. etc. etc.
def SQLnrOfPeopleNamed(dbConn, inpName, inpAge)
dbCurs = dbConn.cursor()
dbCurs.execute(Some SQL-thingy)
#check and return result
但我将创建并关闭更多的游标。我在手册中读到这应该没问题,我认为这是一个很好的解决方案。但我还是有点怀疑。一般来说,按顺序打开和关闭多个游标完全没有问题。您可以将光标视为指向查询结果集的指针,它是指向缓存数据的一组指针。打开光标分配指针,关闭光标释放内存
一般来说,我认为逻辑清洁度在这里是最好的,因此每个查询有一个游标是最好的选择。您可以尝试实现两个版本,然后比较性能。然而,我的直觉告诉我,除非你正在创建,比如说,数千个游标,否则这并不重要。我找到了更多的信息。游标主要用于使数据库对繁重的查询有一些空,特别是当您将它们放在for循环中时。按顺序创建和关闭新游标没有风险。速度测试有助于测试行为,但您永远不会知道代码中是否存在严重错误。我对DB-API没有太多研究,但规范告诉我,单个连接中的多个游标并不是相互隔离的。因此,似乎您实际上应该为单独的逻辑操作使用单独的连接。并在单个事务操作中重用连接。