sqlite3关联机票数量与飞机容量属性出现NameError报错如何解决
SQLite机票库存校验问题修复方案
报错根因
你遇到的NameError: name 'airline' is not defined报错,是因为你错误使用了不存在的airline模块操作数据库,Python中操作SQLite数据库需要通过sqlite3模块提供的连接、游标对象执行SQL语句完成,没有airline.db()这种直接调用语法。
除此之外你的代码还存在建表语法错误、逻辑不完整等问题,完整修复步骤如下:
修复步骤
1. 修正建表逻辑
- 修正模块调用错误:导入的是
sqlite3,连接数据库要调用sqlite3.connect() - 修正SQL语法错误:补全缺失的逗号、修正拼写错误(你代码里的
ı是特殊字符,统一换成英文i避免编码问题) - 新增
Plane表存储飞机容量数据,同时建议ticket表增加航班关联字段,才能对应到具体飞机的容量 - 建表语句执行后要调用
commit()提交事务才会生效
2. 修正业务校验逻辑
- 新增机票前先执行
SELECT语句查询对应航班的已售机票总量、对应飞机的容量 - 对比两个数值后再决定是否允许新增机票
修正后的完整可运行代码
import sqlite3 # 连接数据库 conn = sqlite3.connect("airline.db") cursor = conn.cursor() # 1. 建表:先建Plane表存储飞机信息,再建Ticket表存储机票信息,关联plane_id字段 create_plane_sql = """ CREATE TABLE IF NOT EXISTS PLANE( plane_id INTEGER PRIMARY KEY AUTOINCREMENT, plane_name TEXT NOT NULL, plane_capacity INTEGER NOT NULL ) """ cursor.execute(create_plane_sql) create_ticket_sql = """ CREATE TABLE IF NOT EXISTS TICKET( ticket_no INTEGER PRIMARY KEY AUTOINCREMENT, ticket_type TEXT NOT NULL, ticket_price INT NOT NULL, plane_id INT NOT NULL, FOREIGN KEY (plane_id) REFERENCES PLANE(plane_id) ) """ cursor.execute(create_ticket_sql) conn.commit() # 示例:先插入一条飞机测试数据,容量200 cursor.execute("INSERT INTO PLANE(plane_name, plane_capacity) VALUES (?, ?)", ("波音737", 200)) conn.commit() # 业务逻辑:新增机票前的库存校验,这里示例给plane_id=1的航班新增机票 def add_ticket(ticket_type, ticket_price, plane_id): # 查询当前航班已售机票数 cursor.execute("SELECT COUNT(*) FROM TICKET WHERE plane_id = ?", (plane_id,)) sold_count = cursor.fetchone()[0] # 查询对应飞机的容量 cursor.execute("SELECT plane_capacity FROM PLANE WHERE plane_id = ?", (plane_id,)) capacity = cursor.fetchone()[0] if sold_count < capacity: # 库存足够,插入机票 cursor.execute("INSERT INTO TICKET(ticket_type, ticket_price, plane_id) VALUES (?, ?, ?)", (ticket_type, ticket_price, plane_id)) conn.commit() print("Added Successfully") else: print("There aren't enough tickets for the flight.") # 测试调用 add_ticket("经济舱", 800, 1) # 关闭连接 conn.close()
内容的提问来源于stack exchange,提问作者new_developer
相关产品推荐
相关产品推荐

