游标如何在Python的DB-API中工作?
我一直在RDBMS’(MySQL和PostgreSQL)中使用python,并且我注意到我真的不明白如何使用游标。
通常,使脚本通过客户端DB-API(如psycopg2或MySQLdb)连接到DB:
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没有指定客户端必须检索所有行还是DECLARE实际的SQL游标
。只要fetchXXX接口执行了应有的功能,DB-API就会很高兴。涉及到AFA psycopg2游标(您可能知道),“未命名的DB-API游标”将获取整个结果集-AFAIK由libpq缓冲在内存中。“命名的DB-
API游标”(可能不是可移植的psycopg2概念)将按需请求行(fetchXXX方法)。如“未知”所引用,executemany可用于优化同一命令的多次运行。但是,它不能满足准备好的语句的需要;当具有不同参数集的语句的重复执行不是直接顺序执行时,executemany()的性能将与execute()相同。DB-
API确实为“驱动程序”作者提供了缓存执行的语句的能力,但是其实现(语句的作用域/生存期是多少?)是不确定的,因此无法在DB-API实现中设置期望值。如果要将大量数据加载到PostgreSQL中,强烈建议尝试找到一种使用COPY的方法。