Python sqlite3插入行函数开发遇TypeError报错求助
问题解决步骤
1. 修复insert方法的调用参数错误
报错直接原因是调用database.insert(2022, -17.89)时,把年份和海平面值直接传给了需要SQL语句的query参数。insert方法的第一个参数必须是插入数据的SQL模板字符串,第二个参数是包含数据的元组。
正确调用方式:
database.insert("INSERT INTO e (YEAR, SEA_LEVEL) VALUES (?, ?)", (2022, -17.89))
2. 修复类方法的定义缺陷
你的database类存在多个语法和逻辑问题,需调整如下:
- 类方法需添加
self参数绑定实例,否则无法访问类内的连接和游标 - 数据库连接路径要和之前使用的
z.db保持一致,避免创建新的空数据库 insert方法里的sqliteConnection未定义,需用当前连接对象提交事务- 建表时需提交操作,且建议用
IF NOT EXISTS避免重复建表报错
修改后的类代码:
class database: def __init__(self): # 与之前的数据库路径保持一致 self.conn = sql.connect(r"C:\Users\slaye\OneDrive\Desktop\sqlite\db\z.db") self.cur = self.conn.cursor() def create_table(self): n = """CREATE TABLE IF NOT EXISTS e( YEAR INTEGER PRIMARY KEY, SEA_LEVEL REAL NOT NULL) -- 改为REAL类型适配浮点数 ;""" self.cur.execute(n) self.conn.commit() print("table created") def insert(self, query, tup): self.cur.execute(query, tup) self.conn.commit()
3. 修复字段类型不匹配问题
原建表语句中SEA_LEVEL定义为INTEGER,但你要插入的是浮点数-17.89,会丢失精度,改为REAL类型才能正确存储小数。
4. 正确使用流程示例
# 初始化数据库实例 db = database() # 创建表(若不存在) db.create_table() # 插入数据 db.insert("INSERT INTO e (YEAR, SEA_LEVEL) VALUES (?, ?)", (2022, -17.89))
额外优化(可选)
可以给insert方法封装成更易用的形式,无需每次手写SQL:
def insert_sea_level(self, year, sea_level): query = "INSERT INTO e (YEAR, SEA_LEVEL) VALUES (?, ?)" self.cur.execute(query, (year, sea_level)) self.conn.commit()
调用时直接使用:db.insert_sea_level(2022, -17.89)
内容的提问来源于stack exchange,提问作者Bijan Khair Rahman
相关产品推荐
相关产品推荐

