基于SQLite与Python实现用户输入存储及税额自动计算求助
问题需求
需实现从Income(收入)列自动计算Tax(税额)列的功能,同时将用户输入的信息存储至SQLite数据库,现有Python代码存在问题,需排查并修正。
原代码问题排查
- SQL插入语句语法错误:原代码中
conn.execute的SQL字符串引号、括号不匹配,且format方法调用位置错误,导致SQL语句无法正确生成。 - 缺失税额计算逻辑:未实现根据Income计算Tax的核心功能,插入数据时未传入税额值。
- 输入类型未转换:
input()获取的Income是字符串类型,直接存入数据库会导致数据类型错误,需转为数值型(float/int)。 - 数据库连接关闭时机错误:在循环内部执行
conn.close(),会导致后续操作(若循环次数大于1)无法访问数据库,应在所有操作完成后再关闭连接。 - 表创建语句问题:原表创建语句被注释,首次运行时数据库中无
tax表会导致插入失败;且未使用IF NOT EXISTS,重复运行会报错。 - 存在SQL注入风险:使用字符串格式化拼接SQL语句,若用户输入特殊字符会引发SQL注入问题,应使用参数化查询。
- 游标使用混乱:同时混用
conn.execute和游标c.execute,代码逻辑不统一。
修正后的完整代码
import sqlite3 # 定义税额计算函数,可根据实际税率规则调整 def calculate_tax(income): if income <= 50000: return income * 0.10 elif 50000 < income <= 100000: return 50000 * 0.10 + (income - 50000) * 0.20 else: return 50000 * 0.10 + 50000 * 0.20 + (income - 100000) * 0.25 # 连接SQLite数据库,不存在则自动创建 conn = sqlite3.connect('tax1.db') c = conn.cursor() # 确保tax表存在,避免首次运行报错 c.execute("""CREATE TABLE IF NOT EXISTS tax ( First text, Last text, Income real, Tax real )""") # 获取用户输入并处理 first_name = input("请输入名字:") last_name = input("请输入姓氏:") try: income = float(input("请输入年收入:")) tax = calculate_tax(income) # 使用参数化查询插入数据,避免SQL注入 c.execute("INSERT INTO tax VALUES (?, ?, ?, ?)", (first_name, last_name, income, tax)) conn.commit() # 查询姓氏为Bass的记录并打印 c.execute("SELECT * FROM tax WHERE Last='Bass'") print("查询结果:", c.fetchall()) except ValueError: print("年收入请输入有效的数字!") # 所有操作完成后关闭数据库连接 conn.close()
代码说明
- 税额计算:通过
calculate_tax函数实现超额累进税率计算,可根据实际业务需求修改税率规则。 - 参数化查询:用
?作为占位符传递参数,既避免SQL注入风险,又保证数据类型匹配。 - 错误处理:添加
try-except捕获用户输入非数字的异常,提升代码健壮性。 - 表创建优化:使用
CREATE TABLE IF NOT EXISTS,确保首次运行创建表,重复运行不会触发表已存在的错误。 - 连接管理:统一在所有数据库操作完成后关闭连接,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Ashleigh
相关产品推荐
相关产品推荐

