如何用Python计算SQL数据库中记录的数量

20

我的数据库中似乎无法打印记录的数量:
当我编程时:

cursor = cnxn.cursor()   
count = cursor.execute("select count(*) from fixtures")  
cursor.commit  
print (count)

(fixtures是我的数据库名称)
我理解为:

pyodbc.Cursor object at 0x00000000032FC150  

与其记录数量,我更关注质量。

我正在使用Python上的pyodbc模块。

4个回答

25
对于pyodbc,cursor.execute() 返回游标对象本身。你仍然需要单独检索结果。
你可以循环遍历游标以获取行; list() 可以为您执行循环并将所有行拉入列表对象:
cursor.execute("select count(*) from fixtures")  
print(list(cursor))

您可以调用cursor.fetchall()
对于只有一行的结果集,您可以使用:
cursor.execute("select count(*) from fixtures")
result = cursor.fetchone()

cursor.fetchone()会返回一行数据,如果没有结果则返回None

不管结果如何,每行都是由多个列组成的序列,对于只有一列的结果,将返回一个只包含一个值的元组。

在您的示例查询中,您正在获取单个行和单个列,因此可以使用cursor.fetchone()获取单个值,然后使用索引或元组赋值来获取该值,例如:

cursor.execute("select count(*) from fixtures")
fixture_count = cursor.fetchone()[0]

或者

cursor.execute("select count(*) from fixtures")
fixture_count, = cursor.fetchone()

您不需要在 SELECT 后提交,但您实际上也没有调用 commit() 方法,您缺少了 () 部分。如果您正在更改数据,请记得使用 cursor.commit()。请注意,cursor.commit()cnxn.commit() 执行的是完全相同的操作;事务是按连接而非按游标管理的。

然而,当不使用 autocommit 时,更容易且更好地使用连接作为上下文管理器,以确保根据是否存在任何异常来中止或提交事务:

with cnxn:
    # anything in this block is handled with a transaction.

# after the block the transaction is committed, unless there was an exception.

1
@user3328431:更改标签文本的方式与更改任何其他文本的方式相同。 :-) label_object.set(str(cursor.fetchone()[0])) 应该可以解决问题。 - Martijn Pieters
如果我想在'tkitner' GUI的标签中显示单个记录,而游标的输出是一个列表,我该如何操作? - BigGibb
根据 @Xavi Martinez 的回答和文档,应该是 cursor.fetchone(),没有下划线! - joshi123

8
cursor.execute("SELECT COUNT (*) FROM fixtures")
rowcount = cursor.fetchone()[0]

print (rowcount)

6
这对我有用:

这对我有用:

tempvar = cursor.fetchall()
rowcount = len(tempvar)

0
这是我在sqlite3中的做法。我编写了一个函数,如果你需要多次查询数据库,它可以简化事情。
import sqlite3

def inquire(sql):
    db = sqlite3.connect(my_database.sqlite)
    cursor = db.cursor()
    cursor.execute(sql)
    results = cursor.fetchall()
    return results
    db.close()

sql = "SELECT COUNT (*) FROM fixtures"
results = inquire(sql)

print(results)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接