我一直在使用python和RDBMS'(MySQL和PostgreSQL),我注意到我真的不明白如何使用游标.
通常,他的脚本通过客户端DB-API(如psycopg2或MySQLdb)连接到数据库:
connection = psycopg2.connect(host='otherhost', etc)
然后创建一个游标:
cursor = connection.cursor()
然后可以发出查询和命令:
cursor.execute("SELECT * FROM etc")
现在查询的结果在哪里,我想知道?它在服务器上?还是我的客户端上的一点点,我的服务器上的一点点?然后,如果我们需要访问某些结果,我们会获取它们:
rows = cursor.fetchone()
要么
rows = cursor.fetchmany()
现在让我们说,我不检索所有行,并决定执行另一个查询,以前的结果会发生什么?是他们的开销.
此外,我应该为每种形式的命令创建一个游标,并以某种方式不断地将它重用于那些相同的命令; 我头psycopg2可以某种方式优化多次执行但具有不同值的命令,它是如何值得的?
谢谢
是的,我知道已经几个月了:P
DB-API的游标似乎紧跟SQL游标之后建模。对于AFA资源(行)管理,DB-API没有指定客户端是否必须检索所有行还是将实际的SQL游标声明为DECLARE。只要fetchXXX接口执行了应有的功能,DB-API就会很高兴。
与AFA psycopg2游标有关(您可能知道),“未命名的DB-API游标”将获取整个结果集-AFAIK由libpq缓冲在内存中。“命名的DB-API游标”(一个可能无法移植的psycopg2概念)将按需请求行(fetchXXX方法)。
如“未知”所引用,executemany可用于优化同一命令的多次运行。但是,它不能满足准备好的语句的需要。当具有不同参数集的语句的重复执行不是直接顺序执行时,executemany()的性能将与execute()相同。DB-API确实“为”驱动程序作者提供了缓存执行的语句的能力,但是其实现(语句的范围/生存期是多少?)是不确定的,因此无法在DB-API实现中设置期望值。
如果要将大量数据加载到PostgreSQL中,强烈建议尝试找到一种使用COPY的方法。