【问题标题】:python cx_oracle cursor.rowcount returning 0 but cursor.fetchall returns datapython cx_oracle cursor.rowcount 返回 0 但 cursor.fetchall 返回数据
【发布时间】:2018-02-09 16:43:55
【问题描述】:

我有这个代码,我正在使用 cx_oracle 包从 python 代码执行 select sql 语句:

import cx_Oracle

try:
    cur = conn.cursor()
    result = cur.execute('select * from table1')
    print(str(cur.rowcount))
    print(cur.fetchall())

except Exception as e:
    print(e)

当我执行上面的代码时,我看到 0 进入 cur.rowcount 但我看到以下数据正在打印 cur.fetchall()

[('185',), ('1860',), ('1908',)]

cx_Oracle package documentation 确实提到 Cursor.rowcount 是一个有效的操作,所以我不确定为什么在我的代码中它返回 0,即使数据即将到来?

【问题讨论】:

  • 如果你print(str(cur.rowcount)) 之后 print(cur.fetchall())?
  • @CristiFati 是的,然后它会打印。为什么会出现这种行为?这是 cx_Oracle 包中的要求吗?在pymysql包中不需要这样
  • 我从未使用过 cx_Oracle(至少没有直接使用过)。但是,引用文档(您提供的链接):“此只读属性指定当前已从光标中获取的行数......”。关于 pyMySQL,我对此一无所知,但它们是 2 个独立的包,包含 2 个不同的 DB 系统....我认为它们没有任何限制行为方式相同。

标签: python sql database oracle11g cx-oracle


【解决方案1】:

文档指出 cursor.rowcount 指定当前已获取的行数。在调用 cursor.execute() 之后,没有获取任何行,因此结果为 0。如果调用 cursor.fetchone(),则结果将为 1,如果调用 cursor.fetchmany(5),则结果将是 6,依此类推(当然,假设有足够的行来满足您的要求!)。

【讨论】:

    【解决方案2】:

    cx-oracle.readthedocs提到Cursor.rowcount 指定了受insert、update 和delete 语句影响的行数。您正在使用 select 语句。

    cur.execute('select * from table1')
    result = cur.fetchall()
    print (len(result)) # this will return number of records affected by select statement
    print (result)
    

    【讨论】:

    猜你喜欢
    • 2018-02-26
    • 1970-01-01
    • 2012-02-24
    • 2020-10-18
    • 1970-01-01
    • 2014-05-16
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多