如何用Python查询SQLite3表所有结果并循环处理插入另一表?
解决Python SQLite遍历表并插入数据的问题
我看到你在Python里操作SQLite时遇到了循环遍历和插入的问题,PHP里顺手的逻辑在Python里踩了几个坑,咱们一步步来捋清楚:
你的代码里的几个关键错误
fetchall()的误用:fetchall()会一次性把查询结果的所有行都取出来,放在一个列表里。你在while True里每次调用它,第一次就拿到了所有数据,之后再调用返回的是空列表,但你判断的是row == None,空列表和None是两回事,所以循环根本停不下来,而且你直接取row[0]和row[1]是拿整个结果集的第一行,不是每一行。- 未加引号的字符串变量:你写的
if(Category == High)里的High是个未定义的变量,应该写成Category == "High"(带引号的字符串),Low同理,不然会报NameError。 - SQL语法错误:插入语句里的
'Expensive' 'Red'之间少了逗号,应该是'Expensive', 'Red',不然数据库会报错语法错误。 - SQL注入风险:用字符串格式化拼接SQL语句很危险,而且容易因为特殊字符(比如Item里有单引号)导致语法错误,应该用参数化查询。
修正后的代码方案
这里给你两种可行的写法,选一种你习惯的:
方法1:直接遍历游标(最简洁)
# 查询源表 c.execute(f'SELECT * FROM {ItemPrice_table}') # 直接遍历游标,每次拿到一行数据 for row in c: Item = row[0] Price = row[1] # 简化Category的判断逻辑 if Price <= 10: tag, color = "Cheap", "Blue" else: tag, color = "Expensive", "Red" # 使用参数化查询,避免注入和语法错误 c.execute( f"INSERT INTO {ItemCodes_table} ({Code_column0}, {Code_column1}, {Code_column2}) VALUES (?, ?, ?)", (Item, tag, color) ) # 别忘了提交事务! conn.commit()
方法2:用fetchone()循环
如果你习惯用while循环的写法:
c.execute(f'SELECT * FROM {ItemPrice_table}') while True: row = c.fetchone() # 当fetchone()返回None时,说明没有更多行,退出循环 if row is None: break Item = row[0] Price = row[1] if Price <= 10: tag, color = "Cheap", "Blue" else: tag, color = "Expensive", "Red" # 参数化查询 c.execute( f"INSERT INTO {ItemCodes_table} ({Code_column0}, {Code_column1}, {Code_column2}) VALUES (?, ?, ?)", (Item, tag, color) ) conn.commit()
几个重要的改进说明
- 参数化查询:用
?作为占位符,然后把参数放在元组里传给execute(),这是SQLite推荐的写法,既安全又能避免因为字符串拼接导致的语法错误。 - 简化判断逻辑:把Category的判断和对应的tag、color绑定在一起,减少重复的if判断,代码更简洁。
- 提交事务:SQLite默认是手动提交事务的,所以执行完插入操作后一定要调用
conn.commit(),不然数据不会真正写入数据库。 - 游标遍历:Python的SQLite游标本身是可迭代的,直接用
for row in c就能遍历所有行,比手动调用fetch方法更方便。
内容的提问来源于stack exchange,提问作者Oldtimer
相关产品推荐
相关产品推荐

