问题描述
您好,我希望能够从sqlite数据库检索一组值并将它们全部加在一起。然后,我想将此值插入到使用Tkinter制作的应用程序的antry小部件中。这是我的代码
conn = sqlite3.connect('InvoiceHistory')
D = conn.cursor()
D.execute("""SELECT Invoice_Total FROM InvoiceHistory
WHERE Cust_ID LIKE""" "'%" + Cust_ID_Box.get() + "%'")
All_Money = D.fetchall()
Sum_Totals = sum(All_Money)
VCB_Entry.insert(0,Sum_Totals)
conn.commit()
conn.close()
File "C:/Users/Lukas/Desktop/.idea/HatCo.py",line 967,in Show_Balance
Sum_Totals = sum(All_Money)
TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
我知道这是因为当我将All_Money打印到控制台时,它会以这种方式出现:
[(438.0,),(348.0,)]
我的问题是:如何从元组中获取这些值并将它们加在一起?预先谢谢你。
解决方法
您可以使用列表推导从All_Money
中创建一个新列表,看起来像这样:
sum([inner_tup[0] for inner_tup in All_Money])
并会产生类似的内容:
sum([438.0,348.0])
sum方法可接受的输入
,为什么不简单地在数据库中进行计算?这更简单,更有效:
conn = sqlite3.connect('InvoiceHistory')
cur = conn.cursor()
cust_id = "%" + Cust_ID_box.get() + "%"
cur.execute("SELECT SUM(Invoice_Total) FROM InvoiceHistory WHERE Cust_ID LIKE ?",(cust_id,));
rec = cur.fetchone()
sum_totals = rec[0]
请注意,我更改了代码以将变量作为查询参数而不是将其串联到查询字符串中:参数化查询使您的代码更安全(当输入来自程序外部时),并且效率更高(数据库可以不需要在每次执行时都重新解析查询。)