Как извлечь значение из объекта cursor?

#python

#питон #python

Вопрос:

Ниже приведен мой код.Функция Combiner(), которая выдает неправильные значения:

 [(Decimal('3213.713766'),)] [(Decimal('7.041164'),)]
  

Мне нужны только значения 3213.713766 7.041164

 def data_generation():
    con=mysql.connector.connect()
    cursor=con.cursor()
    cursor.execute("CALL `Pulse`.`SP_GetAverageBillRate`();")
    data=cursor.fetchall()
    return data

def data_generation2():
    con=mysql.connector.connect()
    cursor=con.cursor()
    cursor.execute("CALL `Pulse`.`SP_GetAverageGrossProfit`();")
    data2=cursor.fetchall()
    return data2


def combiner():

    AverageBilling = data_generation()
    AverageGrossProfit = data_generation2()
    return [AverageBilling, AverageGrossProfit]
  

Как мне получить значения из этого возвращаемого объекта?

Ответ №1:

Все соединители баз данных python, которые следуют за DBAPI, будут возвращать кортежи для строк, даже если вы выбрали только один столбец (или вызвали функцию, которая возвращает одно значение, как вы это сделали).

Это означает, что вы всегда получаете кортеж, возможно, содержащий только один элемент, для каждого fetchone() вызова.

Вы можете получить это единственное значение, извлекая элемент с индексом 0 из кортежа:

 row = cursor.fetchone()
data = row[0]
data2 = float(data)
  

Или в одной строке:

 data2 = float(cursor.fetchone()[0])
  

Комментарии:

1. Спасибо, что он работает, но теперь я получаю ошибку ValueError: форма передаваемых значений равна (2, 1), индексы подразумевают (2, 2)

2. @zzstar вы должны реализовать эти исправления и задать новый вопрос, поскольку эта ошибка не встречается в этом фрагменте кода.

Ответ №2:

Достаточно простое исправление fetchone вместо all, поэтому вы не получаете список результатов. Вы получите кортеж с одним элементом, который вы выберете, [0] а затем просто приведете результат к float :

 def data_generation():
    con=mysql.connector.connect("connection_string")
    cursor=con.cursor()
    cursor.execute("CALL `Pulse`.`SP_GetAverageBillRate`();")
    data = float(cursor.fetchone()[0])
    return data

def data_generation2():
    con=mysql.connector.connect("connection_string")
    cursor=con.cursor()
    cursor.execute("CALL `Pulse`.`SP_GetAverageGrossProfit`();")
    data2 = float(cursor.fetchone()[0])
    return data2

def combiner():
    AverageBilling = data_generation()
    AverageGrossProfit = data_generation2()
    return [AverageBilling, AverageGrossProfit]
  

Комментарии:

1. я перешел на fetchone и появляется ошибка аргумент float () должен быть строкой или числом, а не «кортежем»

2. @zzstar немного отредактировал мой ответ, теперь он должен работать.