sqlite python,嵌套循环停止主循环

2024-05-16 03:59:32 发布

您现在位置: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'中的所有行上循环,如何让它在所有行上循环


Tags: fromforexecutefoodconnitemrowvalues
2条回答

游标一次只能保存一个查询的结果,您需要将第一个查询的结果保存到一个变量中:

first = c.execute('SELECT * FROM food_consumption').fetchall()

for row in first:
    print(row[1])
    for number in c.execute('SELECT calories FROM nutritional_values WHERE item=(?)', (row[1],)):
        print(number)

我不清楚您当前的方法为什么不起作用,但无论如何,这是一种糟糕的设计模式,您应该在两个表之间执行连接,处理数据库端的关系:

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的内存中

相关问题 更多 >