如何从python中的SQLite查询中获取单个结果?

时间:2011-08-10 13:09:07

标签: python sql sqlite

使用python 2.7时,是否有一种优雅的方法可以从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并直接获取值?我试过了

maxVal = cursor[0][0]

没有任何成功。

7 个答案:

答案 0 :(得分:56)

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

cursor.fetchone()[0]

答案 1 :(得分:4)

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

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

    return cursor.fetchone()[0]

我为上面可能不太符合语法的Python道歉,但我希望你明白这一点。

答案 2 :(得分:2)

如果你没有使用内置cursor.fetchone

的pysqlite
cursor.execute("select value from table order by value desc limit 1")

答案 3 :(得分:0)

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

答案 4 :(得分:0)

Sequence unpacking可用于从结果元组中提取标量值。

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

for result, in cursor:
    print(result)

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

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

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

a, b = (1, 2)

除了元组只有一个元素:

a, = (1,)

答案 5 :(得分:0)

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

由于 fetchone() 文档:

<块引用>

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

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

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

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

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

答案 6 :(得分:-3)

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