游标和连接对象之间的区别

Ama*_*tam 20 python python-db-api

我很困惑为什么python需要游标对象.我知道jdbc,那里的数据库连接非常直观但是在python中我与游标对象混淆了.另外,我怀疑在资源释放方面cursor.close()和connection.close()函数之间的区别是什么.

Too*_*ote 19

游标范例不是特定于Python的,而是数据库本身的频繁数据结构.

根据底层实现,可以生成与数据库共享相同连接的多个游标.关闭游标应释放与查询关联的资源,包括从未从数据库中获取的任何结果(或已获取但未使用的结果),但不会消除与数据库本身的连接,因此您可以在同一数据库上获取新游标无需再次进行身份验证.

  • 所有这些细节都隐藏在“取决于底层实现”中。您必须阅读相应数据库驱动程序的文档 (2认同)

Joh*_*Jr. 8

连接对象是您与数据库的连接,当您完成与数据库的通信后将其关闭。游标对象是查询结果集的迭代器。当您完成该结果集后,关闭它们。

  • 我怀疑它是一个迭代器,因为有一个命令如execute(sql_string) 执行sql 字符串。对于任何结果集的迭代器来说,具有这样的功能是没有意义的 (9认同)
  • 你说得对,但是光标不仅是客户端上的结构,也是服务器上的结构。它有助于利用准备好的 SQL 语句、执行它们,并在执行后迭代其结果。 (2认同)

Sin*_*ion 7

正如其他人所提到的,a Connection()是与数据库的网络连接,它唯一真正的用途是返回游标. PEP-249(其中指定了DBApi 2.0)没有明确定义连接或游标的确切内容,也没有明确定义close()每个方法必须执行的操作; 只是 <module>.connect() 必须返回的实例 <module>.Connection ,即 <module>.Connection.cursor() 必须返回一个实例 <module>.Cursor ,而 <module>.Cursor.execute() 应该调用提供的声明,并返回结果行.特别是,它没有定义 <module>.Connection.execute() ,尽管具体实现可以自由地将它们实现为扩展.

但是,根据这些扩展可能是不明智的,因为这意味着你不会拥有可移植的代码.DBApi提出了这个两级要求,因为在某些数据库上对连接执行而没有中间对象可能很困难.