在 int python 中转换 SQLITE 'NoneType



我正在尝试从 Db 中"选择"一个值并将该值添加到另一个变量中,但是当我执行此操作时,我收到此错误"类型错误:+ 不支持的操作数类型:"无类型"和"整数">

id = input("Digite o id do cartão: ")
cash = int(input("Digite o o valor a ser creditado: "))
dia = 3
sql = 'SELECT saldo FROM carteira where idcartao = ?'

def selectbanco():
c.execute("SELECT saldo FROM carteira WHERE idcartao=?", (id,))
row = c.fetchone()
print(row)
row = c.fetchone()
soma = (row) + (cash)
c.execute("UPDATE carteira SET saldo=?  WHERE idcartao=?", (soma, id))
connection.commit()
selectbanco()

这是我的完整代码

import sqlite3
connection = sqlite3.connect('clientes.db')
c = connection.cursor()
#criação de tabela
def create_table():
c.execute('CREATE TABLE IF NOT EXISTS carteira (idcartao REAL, saldo REAL, data text)')
create_table()
#variaveis
id = input("Digite o id do cartão: ")
cash = int(input("Digite o o valor a ser creditado: "))
dia = 3
sql = 'SELECT saldo FROM carteira where idcartao = ?'
#SELECT E RETORNAR VALOR
def selectbanco():
c.execute("SELECT saldo FROM carteira WHERE idcartao=?", (id,))
row = c.fetchone()
print(row)
row = c.fetchone()
##soma = (row + cash)
##print(soma)
c.execute("UPDATE carteira SET saldo=?  WHERE idcartao=?", (cash, id))
connection.commit()
selectbanco()
#leitura do banco
def read_data(wordUsed):
for row in c.execute(sql, (wordUsed,)):
print (row)
read_data(id)
connection.close()

你这里有两个问题。

第一种情况是通过调用row = c.fetchone()两次来耗尽生成器,而无需重新执行查询。对于每个查询结果,只能循环访问一次游标;之后,您将需要重新运行查询以"刷新"数据并能够再次迭代。

其次,如果你没有得到匹配,fetchone()实际上会返回None。这与在没有匹配的情况下返回空列表([](的fetchall()相反。

这个快速示例应说明此行为:

import sqlite3
# Create a fake database
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute("""CREATE TABLE IF NOT EXISTS some_table(
something TEXT
)""")
c.execute(""" INSERT INTO some_table VALUES('hello') """)

c.execute("SELECT * FROM some_table")
# We get a match and this will print '(hello,)'
data = c.fetchone()
print(data)

data = c.fetchone()
# If we don't execute the query again but try to use the exhausted generator
# then we'll also get None
print(data)

c.execute("SELECT * FROM some_table WHERE something = 'bye'")
# This will print 'None' because fetchone() didn't get a result
data = c.fetchone()
print(data)

c.execute("SELECT * FROM some_table WHERE something = 'bye'")
# This will print an empty list because fetchall() didn't get a result
data = c.fetchall()
print(data)
c.close()
conn.close()

即使None[]不同,它们仍然是错误的,因此,在您的问题的上下文中,您仍然可以将任一响应转换为整数:

conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute("""create table if not exists some_table(
something TEXT
)""")
c.execute(""" INSERT INTO some_table VALUES('hello') """)
# Get back None or an integer
c.execute(""" SELECT * FROM some_table WHERE something = ?""", ('bye', ))
data = c.fetchone() or 1 # This is where you return an integer instead of None
print(data)
c.close()
conn.close()

我选了一个1的整数值,也许你想要0,我不确定。但是,需要注意的是,您有两种途径可以在此处获取None或虚假数据,并且您将它们都视为相同,这对于代码的清晰度不是很好。

您正在获取两次行。您需要删除第二个提取才能接收该行。

def selectbanco():
c.execute("SELECT saldo FROM carteira WHERE idcartao=?", (id,))
row = c.fetchone()
print(row)
soma = (row) + (cash)
c.execute("UPDATE carteira SET saldo=?  WHERE idcartao=?", (soma, id))
connection.commit()
selectbanco()

该变量被覆盖,因为您没有指定在获取之前(第二次(要执行的命令,因此使用 NoneType。

最新更新