pyodbc 的`Cursor.execute` 返回哪个游标对象?

B98*_*B98 2 python pyodbc

根据PEP249Cursor.execute没有定义的返回值。 pyodbc,然而,似乎使它返回一个游标对象;文档也这么说,虽然相当简短:

execute (...)
C.execute(sql, [params]) --> Cursor

这是否有更详细的保证/记录?

查看身份,返回的对象似乎是完全相同的游标,也许用于链接调用?

>>> thing_called_cursor = conn.cursor()
>>> result = thing_called_cursor.execute("SELECT * FROM Item")
>>> result
<pyodbc.Cursor object at 0x10b3290f0>
>>> thing_called_cursor
<pyodbc.Cursor object at 0x10b3290f0>
Run Code Online (Sandbox Code Playgroud)

还,

>>> id(result)
4482830576
>>> id(thing_called_cursor)
4482830576
Run Code Online (Sandbox Code Playgroud)

我可以尝试查看来源,但我宁愿不依赖我在那里找到的任何东西。也许最好忽略当前返回的任何内容,Cursor.execute因为这样做最符合 PEP 中的规范?

C.B*_*.B. 5

源码可以看出,最后它最终会返回一个return (PyObject*)cur;,这是执行首先传递的游标。但是,看起来确实存在返回 的情况0

看起来这也包含在README.md

DB API 规范没有指定 Cursor.execute 的返回值。以前版本的 pyodbc (2.0.x) 返回不同的值,但 2.1 版本总是返回 Cursor 本身。

这允许紧凑的代码,例如:

for row in cursor.execute("select album_id, photo_id from photos where user_id=1"):
    print row.album_id, row.photo_id

row  = cursor.execute("select * from tmp").fetchone()
rows = cursor.execute("select * from tmp").fetchall()

count = cursor.execute("update photos set processed=1 where user_id=1").rowcount
count = cursor.execute("delete from photos where user_id=1").rowcount
Run Code Online (Sandbox Code Playgroud)

所以看起来它的原因是提倡紧凑的代码。