37

使用 Python 时,是否有一种优雅的方法可以从 SQLite SELECT 查询中获取单个结果?

例如:

conn = sqlite3.connect('db_path.db')
cursor=conn.cursor()
cursor.execute("SELECT MAX(value) FROM table")

for row in cursor:
    for elem in row:
        maxVal = elem

有没有办法避免那些嵌套for的 s 并直接获取值?我试过了

maxVal = cursor[0][0]

没有任何成功。

4

7 回答 7

77

我认为您正在寻找Cursor.fetchone()

cursor.fetchone()[0]
于 2011-08-10T13:11:58.890 回答
7

或者你可以编写一个包装函数,给定 SQL,返回一个标量结果:

def get_scalar_result(conn, sql):
    cursor=conn.cursor()
    cursor.execute(sql)

    return cursor.fetchone()[0]

对于上面可能在语法上不太正确的 Python,我深表歉意,但我希望你明白这一点。

于 2011-08-10T13:37:51.577 回答
3

如果您不使用内置的 pysqlitecursor.fetchone

cursor.execute("select value from table order by value desc limit 1")
于 2014-12-05T23:46:23.300 回答
2

小心,接受的答案可能会导致TypeError

由于fetchone()文档:

获取查询结果集的下一行,返回单个序列,或者当没有更多数据可用时返回 None。

因此,某些 SQL 查询cursor.fetchone()[0]可能会变成None[0]导致引发TypeError异常的情况。

获得第一行的更好方法None是:

first_row = next(cursor, [None])[0]

如果 SQL 查询为空,next将使用默认值[None]并从该列表中获取第一个元素而不引发异常。

于 2021-06-29T23:03:23.860 回答
1

序列解包可用于从结果元组中提取标量值。

cursor.fetchall如果有多行,则通过遍历游标(或):

for result, in cursor:
    print(result)

或者cursor.fetchone如果结果集中只有一行,则使用:

result, = cur.fetchone()
print(result)

在这两种情况下,尾随逗号result从单元素元组中解包元素。这与更常见的相同

a, b = (1, 2)

除了元组只有一个元素:

a, = (1,)
于 2020-09-05T09:47:39.000 回答
-1

select count(*) from ... groupy by ...返回None而不是0,因此fetchone()[0]会导致异常。

所以

def get_scalar_from_sql(sqlcur, sqlcmd):
    # select count(*) from .... groupy by ... returns None instead of 0
    sqlcur.execute(sqlcmd)
    scalar = 0
    tuple_or_None = sqlcur.fetchone()
    if not tuple_or_None is None:
        (scalar,) = tuple_or_None
    return scalar
于 2018-09-26T20:39:33.133 回答
-4

或者您可以尝试: cursor.execute("SELECT * FROM table where name='martin'")

于 2011-08-10T13:22:05.213 回答