Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PostgreSQL/performance为每个查询创建一个通用游标或_Python_Postgresql_Cursor_Python Db Api - Fatal编程技术网

Python PostgreSQL/performance为每个查询创建一个通用游标或

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

我正在构建一个脚本来在数据库中存储一些数据。我第一次使用PostgeSQL时,一切都进展顺利,并按计划进行。我在想PostgreSQl中游标的用法,如果我做了很多,而一个就足够了怎么办。但是我不想把游标传递给我所有的SQL函数

下面是我的简化示例

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没有太多研究,但规范告诉我,单个连接中的多个游标并不是相互隔离的。因此,似乎您实际上应该为单独的逻辑操作使用单独的连接。并在单个事务操作中重用连接。