int()参数必须是字符串,类似字节的对象或数字,而不是“元组”

时间:2019-04-07 19:19:42

标签: python sql string tkinter

因此,本节中我的代码应该从sql数据库中获取一个值并将tkinter值添加到该值上,然后将该值放回sql数据库中

    with sqlite3.connect('aircraft.db') as db:
        c = db.cursor()
        self.flightcount4 = self.flightcount5.get()
        self.flightcount3 = int(self.flightcount4)

        c.execute("SELECT flightcount FROM aircraft WHERE Arrive = ?",(self.travelselect.get(),))
        self.total3 = c.fetchone()
        total2 = int(self.total3)
        self.total = total2 + self.flightcount3
        c.execute('UPDATE aircraft SET flightcount = :flightcount WHERE Arrive = :Arrive',{'flightcount':self.flightcount3, 'aircraftpilot':self.pilotname5 })
        db.commit()
        ms.showinfo('Success!', 'its saved!')

这是我的代码。

 Exception in Tkinter callback
 Traceback (most recent call last):
 File "C:\Users\adam\AppData\Local\Programs\Python\Python36- 
 32\lib\tkinter\__init__.py", line 1702, in __call__
 return self.func(*args)
 File "C:\A LEVELS\Computing\atom\actual results\working\Customer.py", 
 line 40, in addtocount
 total2 = int(self.total3)
 TypeError: int() argument must be a string, a bytes-like object or a 
 number, not 'tuple'
 [Finished in 30.761s]

这是错误。

从那时起,我在您的帮助下提出了这个建议:

 def addtocount(self):

    with sqlite3.connect('aircraft.db') as db:
        c = db.cursor()
        self.flightcount4 = self.flightcount5.get()
        self.flightcount3 = int(self.flightcount4)

        c.execute("SELECT flightcount FROM aircraft WHERE Arrive = ?",(self.travelselect.get(),))
        self.total3 = c.fetchone()[0]
        print(self.total3)
        if self.total3 == "None":
            self.total2 == int("0")
            print(self.total2)
        else:
            self.total2 = self.total3
        self.total = self.total2 + self.flightcount3
        c.execute('UPDATE aircraft SET flightcount = :flightcount WHERE Arrive = :Arrive',{'flightcount':self.flightcount3, 'aircraftpilot':self.pilotname5 })
        db.commit()
        ms.showinfo('Success!', 'its saved!')

但是现在错误是:

  File "C:\A LEVELS\Computing\atom\actual results\working\Customer.py", line 46, in addtocount
self.total = self.total2 + self.flightcount3
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
[Finished in 15.573s]

预先感谢

6 个答案:

答案 0 :(得分:3)

据我所知c.fetchone()获取整行。即使您仅在SQL语句中指定一个值,它也将被包装在一个元组中。语法上,如果您尝试打印它,它将看起来像这样:

('flightcount value')

请注意值周围那些讨厌的括号。

出现错误的原因是因为int(self.total3)试图解析c.fetchone()中的整个元组(行)。相反,您需要从行中选择特定的列,如下所示:

int(self.total3[0])

答案 1 :(得分:2)

该错误正是Python告诉您的:int()仅接受字符串,字节(另一种字符串)或数字,并且您正在传递元组。这意味着self.total3是一些这样包装的值集:(x,y,z)

查看sqlite的Python文档,似乎它以元组的形式返回数据库行,每个元组槽代表数据库的一列。您可以使用赋值或索引解开元组:

col1, col2, col3 = row  # where row is (col1, col2, col3)
col1 = row[0]  # indexed from 0

遇到此类问题时,我的第一步是始终查找有问题的冒犯性值(此处是编译器指向我们的“ int()参数” self.total3),而简单地{{ 1}},以查看看起来有什么问题。

如果您不在此上下文之外使用它们,则可能不需要引入所有这些类状态变量(print())。将局部变量用于仅在此上下文中使用的任何内容会更简单。

答案 2 :(得分:1)

self.total3 = c.fetchone()
total2 = int(self.total3)

在这里,self.total3是整行。即使选择了单个值,返回值也将包装在元组中。您需要从元组中获取价值。

self.total3 = c.fetchone()[0]
total2 = int(self.total3)

答案 3 :(得分:1)

fetchone()返回一个元组,因为它支持检索多行内容。在您的情况下,您选择了一个东西(flightcount),但是您仍然必须将返回值视为元组。所以应该是:

self.total3 = c.fetchone()[0]

答案 4 :(得分:0)

尝试访问第一个元素:

int(self.total3 [0])

self.total3 = cursor.fetchone()[0]

答案 5 :(得分:0)

int()只能解析一个值,而不是元组。您可以做的是:

total2 = [int(value) for value in self.total3] 

然后,将元组值存储在整数列表中。