You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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()

几个重要的改进说明

  1. 参数化查询:用?作为占位符,然后把参数放在元组里传给execute(),这是SQLite推荐的写法,既安全又能避免因为字符串拼接导致的语法错误。
  2. 简化判断逻辑:把Category的判断和对应的tag、color绑定在一起,减少重复的if判断,代码更简洁。
  3. 提交事务:SQLite默认是手动提交事务的,所以执行完插入操作后一定要调用conn.commit(),不然数据不会真正写入数据库。
  4. 游标遍历:Python的SQLite游标本身是可迭代的,直接用for row in c就能遍历所有行,比手动调用fetch方法更方便。

内容的提问来源于stack exchange,提问作者Oldtimer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:40:36