如何访问受以下因素影响的行数:
cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")
来自PEP 249,通常由 Python 数据库 API 实现:
光标对象应响应以下方法和属性:
[…]
.rowcount
此只读属性指定最后一个 .execute*() 生成的行数(对于像“select”这样的 DQL 语句)或受影响的(对于像“update”或“insert”这样的 DML 语句)。
但要小心——它接着说:
.execute*()
如果没有对游标执行任何操作,或者接口无法确定最后一次操作的行数,则该属性为 -1 。[7]注意:
DB API 规范的未来版本可能会重新定义后一种情况,以使对象返回None
而不是 -1。
因此,如果您已经执行了您的语句,并且它有效,并且您确定您的代码将始终针对相同 DBMS 的相同版本运行,那么这是一个合理的解决方案。
尝试使用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()
从执行返回影响的行数:
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
"""
在我看来,获取所选行数的最简单方法如下:
当使用 fetch 命令(fetchall()、fetchone()、fetchmany())时,游标对象会返回一个包含结果的列表。要获取选定的行,只需打印此列表的长度。但这对 fetchall() 来说才有意义。;-)
例子:
print len(cursor.fetchall)
要获取所选行数,我通常使用以下命令:
cursor.execute(sql)
count = (len(cursor.fetchall))
使用count(*)
结果是{'count(*)': 9}
-- 对于实例,其中 9 表示表中的行数。
因此,为了获取唯一的数字,这在我的情况下有效,使用 mysql 8。
cursor.fetchone()['count(*)']