Python:cursor.execute影响的行数(“SELECT ...”)

时间:2010-03-24 21:52:55

标签: python sql rows database

如何访问受以下因素影响的行数:

cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")

6 个答案:

答案 0 :(得分:87)

来自PEP 249,通常由Python数据库API实现:

  

Cursor Objects应响应以下方法和属性:

[...]

  

.rowcount
             此只读属性指定最后一个.execute *()生成的行数(对于像'select'这样的DQL语句)或受影响的行(对于'update'或'insert'等DML语句)。

但要小心 - 接着说:

  

如果对游标没有执行.execute*(),或者接口无法确定最后一次操作的行数,则该属性为-1。 [7]

     

注意:
  DB API规范的未来版本可以重新定义后一种情况,使对象返回None而不是-1。

因此,如果您执行了语句,您确定您的代码将始终针对相同DBMS的相同版本运行,这是一个合理的解决方案。

答案 1 :(得分:64)

尝试使用fetchone

cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")
result=cursor.fetchone()

result将包含一个元素,其值为COUNT(*)。 所以要找到行数:

number_of_rows=result[0]

或者,如果你宁愿一下子做到这一点:

cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")
(number_of_rows,)=cursor.fetchone()

PS。尽可能使用参数化参数也是一种好习惯,因为它可以在需要时自动为您引用参数,并防止sql注入。

参数化参数的正确语法取决于您的python /数据库适配器(例如mysqldb,psycopg2或sqlite3)。它看起来像

cursor.execute("SELECT COUNT(*) from result where server_state= %s AND name LIKE %s",[2,digest+"_"+charset+"_%"])
(number_of_rows,)=cursor.fetchone()

答案 2 :(得分:36)

受影响的行数从execute:

返回
rows_affected=cursor.execute("SELECT ... ")

当然,正如AndiDog已经提到的,您可以通过随时访问游标的rowcount属性来获取行计数,以获取上次执行的计数:

cursor.execute("SELECT ... ")
rows_affected=cursor.rowcount

来自python MySQLdb的内联文档:

 def execute(self, query, args=None):

    """Execute a query.

    query -- string, query to execute on server
    args -- optional sequence or mapping, parameters to use with query.

    Note: If args is a sequence, then %s must be used as the
    parameter placeholder in the query. If a mapping is used,
    %(key)s must be used as the placeholder.

    Returns long integer rows affected, if any

    """

答案 3 :(得分:16)

在我看来,获取所选行数量的最简单方法如下:

当使用fetch命令(fetchall(),fetchone(),fetchmany())时,游标对象返回一个包含结果的列表。要获取所选行,只需打印此列表的长度。但它对fetchall()有意义。 ; - )

示例:

print len(cursor.fetchall) 

答案 4 :(得分:0)

要获取选定的行数,通常使用以下命令:

cursor.execute(sql)
count = (len(cursor.fetchall))

答案 5 :(得分:0)

使用count(*)时的结果是{'count(*)': 9}

-其中9代表实例中表中的行数。

因此,为了获取公正的数字,在我的情况下,使用mysql 8可以正常工作。

cursor.fetchone()['count(*)']