python - sqlite python,嵌套循环停止主循环
问题描述
import sqlite3
conn = sqlite3.connect('food.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS nutritional_values
(item, calories, total fat, protein)''')
items = [ ('Broccoli Chinese', 22, 0.7, 1.1),
('chia seeds', 490, 30.8, 15.6),
('blueberries', 57, 0.3, 0.7),]
c.executemany('INSERT INTO nutritional_values VALUES (?,?,?,?)',items)
c.execute('''CREATE TABLE IF NOT EXISTS food_consumption
(date, item, amount)''')
c.execute('DELETE FROM food_consumption')
consumed = [ ('24/8/2019', 'Broccoli Chinese', 1.5),
('24/8/2019', 'chia seeds', 0.35),
('24/8/2019', 'blueberries', 0.4),]
c.executemany('INSERT INTO food_consumption VALUES (?,?,?)',consumed)
conn.commit()
conn.close()
如果我运行:
for row in c.execute('SELECT * FROM food_consumption'):
print(row[1])
正如预期的那样,我得到:
Broccoli Chinese
chia seeds
blueberries
但如果我运行:
for row in c.execute('SELECT * FROM food_consumption'):
print(row[1])
for number in c.execute('SELECT calories FROM nutritional_values WHERE item=(?)', (row[1],)):
print(number)
我得到:
Broccoli Chinese
(22,)
所以它不再循环遍历表中的所有行'food_consumption'
,我如何让它遍历所有行?
解决方案
我不确切知道为什么您当前的方法不起作用,但无论如何这是一个糟糕的设计模式,您应该通过在两个表之间进行连接,处理数据库端的关系:
sql = """SELECT nv.item, nv.calories
FROM nutritional_values nv
INNER JOIN food_consumption fc
ON nv.item = fc.item"""
for row in c.execute(sql):
print(row[1])
请注意,这是处理您的问题的首选方法,因为它避免将整个结果集加载到 Python 的内存中。
推荐阅读
- python-3.x - 将“年、年中的某一天、小时、分钟、秒”值的字符串转换为“年月日小时分钟秒”
- javascript - 从选项中过滤列中的数据使用 jQuery
- mysql - 是否可以使用 JOOQ 形成一个简单的字符串查询,而无需使用连接创建工厂,因为不需要编译时检查?
- typescript - 如何在 Firebase 云功能中包含用于 Google 云存储的 Typescript 类型
- python - 当我按下一个键时,pygame 内部会发生什么?何时使用 pygame.event==KEYDOWN
- docker - Traefik 请求中缺少前缀
- php - 使用 PHP 在 MongoDB 中的数百万行。我们如何才能更快地检索和显示它?
- xml - PL/SQL 中的 XMLPATCH?
- spring-boot - 做 FLux.zip 时如何区分发布者?
- c++ - 序列容器 - 为什么所有容器都没有所有方法