fetchall 的结果始终是一个元组列表。如果您的查询总是只返回一行(或者您只关心第一行),最好使用fetchone - 这将返回一个元组。
无论如何,如果您想提取元组的第一个元素,在 Python 中执行此操作的惯用方法是通过元组解包,如下所示:
a = (1,)
(b,) = a
# Now b == 1
解释:(b,) = a 赋值检查 a 是否为单元素元组,如果是,则将名称 b 分配给其第一个元素。
如果你坚持使用 fetchall,下面的习语可以让你解压元组列表的第一个元素(如果你知道它是一个单元素元组,就像你的例子一样)
a = [(1,)]
# a can also have more elements, it doesn't matter
(b,), *_ = a
解释:赋值(b,), *_ = a遍历a,获取第一个元素并执行与上面相同的操作,然后获取所有其他元素并将它们放入一个名为_的新创建列表中@(@987654331 @ 是 Python 中一次性变量的标准名称;但是,您实际上可以在此处使用任何其他名称,而不是 b - 如果这样做,会发生一些奇怪的事情 - 如果需要,请尝试)。
当然,毕竟,在您的情况下,您需要使用float() 将string 转换为float。因此,您的案例中的代码可能如下所示:
mycursor.execute("SELECT buyprice FROM BTC_position")
(BTC_buyprice,) = mycursor.fetchone()
BTC_buyprice = float(BTC_buyprice)
(我想不出一种优雅而惯用的方式来压缩最后两行。)
如果您不希望只获得一行,则您可能希望获得浮动列表。这可以通过使用列表推导(结合上述习语)来完成:
mycursor.execute("SELECT buyprice FROM BTC_position")
BTC_buyprice = [float(price) for (price,) in mycursor.fetchall()]