You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在Python中使用SQLite3从关联表打印食谱关联食材名称可行吗?

当然可以!这其实就是SQL里典型的表关联查询场景,结合Python的sqlite3模块完全能轻松实现。我给你一步步拆解怎么做:

实现步骤和代码示例

先理清楚表关联逻辑

首先得确认你的表结构,假设你的两张核心表大概是这样的(如果字段/表名有差异,对应调整就行):

  • recipes表:存储食谱信息,比如id(食谱ID)、name(食谱名称),还有用来关联食材的ingredients_id(或者如果是多食材,可能有个中间关联表比如recipe_ingredients
  • ingredients表:存储食材信息,核心字段是id(食材ID)和name(食材名称)

编写关联查询的SQL语句

核心是用JOIN关键字把两张表关联起来,把食材ID映射成对应的名称,分两种常见场景:

场景1:单食谱对应单个食材

如果你的recipes表直接存单个ingredients_id,用简单的JOIN就能搞定:

SELECT r.id AS recipe_id, r.name AS recipe_name, i.name AS ingredient_name
FROM recipes r
INNER JOIN ingredients i ON r.ingredients_id = i.id;

场景2:单食谱对应多个食材(推荐的规范设计)

如果是一个食谱需要多种食材,通常会有个中间关联表(比如recipe_ingredients,字段是recipe_idingredient_id),这时候可以用GROUP_CONCAT把多个食材名称拼成逗号分隔的字符串,方便查看:

SELECT r.id AS recipe_id, r.name AS recipe_name, GROUP_CONCAT(i.name, ', ') AS ingredients_list
FROM recipes r
INNER JOIN recipe_ingredients ri ON r.id = ri.recipe_id
INNER JOIN ingredients i ON ri.ingredient_id = i.id
GROUP BY r.id, r.name;

Python代码落地实现

直接上可运行的代码,注释里写了调整要点:

import sqlite3

# 1. 连接到你的SQLite数据库
# 如果你是文件型数据库,替换成你的db文件路径,比如'./my_recipes.db'
conn = sqlite3.connect('cookbook.db')
cursor = conn.cursor()

# 2. 选择对应的SQL语句(根据你的表结构注释/取消注释)
# --- 场景1:单食材关联 ---
# sql_query = """
# SELECT r.id AS recipe_id, r.name AS recipe_name, i.name AS ingredient_name
# FROM recipes r
# INNER JOIN ingredients i ON r.ingredients_id = i.id;
# """

# --- 场景2:多食材关联(带中间表) ---
sql_query = """
SELECT r.id AS recipe_id, r.name AS recipe_name, GROUP_CONCAT(i.name, ', ') AS ingredients_list
FROM recipes r
INNER JOIN recipe_ingredients ri ON r.id = ri.recipe_id
INNER JOIN ingredients i ON ri.ingredient_id = i.id
GROUP BY r.id, r.name;
"""

# 3. 执行查询并获取结果
cursor.execute(sql_query)
all_recipes = cursor.fetchall()

# 4. 格式化打印结果
print("=== 食谱与对应食材 ===")
for recipe in all_recipes:
    if len(recipe) == 3:
        # 场景1的输出格式
        print(f"食谱ID: {recipe[0]} | 名称: {recipe[1]} | 食材: {recipe[2]}")
    else:
        # 场景2的输出格式
        print(f"食谱ID: {recipe[0]} | 名称: {recipe[1]} | 食材列表: {recipe[2]}")

# 5. 关闭数据库连接(好习惯)
cursor.close()
conn.close()

几个关键注意点

  • 一定要根据你的实际表名、字段名修改SQL里的名称,比如如果你的食材表叫foods,就把ingredients改成foods
  • 如果你的recipes表是用逗号分隔的多个ID存食材(比如ingredients_id是"1,3,5"这种),这种设计不推荐,但如果已经这么做了,可以用SQL的字符串函数处理,不过更建议改成中间关联表的结构,后续维护更方便
  • 测试的时候可以先单独在SQLite工具里跑一遍SQL语句,确认能拿到正确结果,再放到Python代码里

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

火山引擎 最新活动