游标如何在Python的DB-API中工作?

发布于 2021-01-29 15:14:24

我一直在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可以以某种方式优化多次执行但具有不同值的命令,这是值得吗?

谢谢

关注者
0
被浏览
45
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    是的,我知道已经几个月了: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的方法。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看