使用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]
没有任何成功。
答案 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
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'")