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

Python3操作SQLite多对多关系时关联表填充问题求解

获取新插入图片的ID

SQLite 游标对象自带 lastrowid 属性,可直接返回最近一次 INSERT 操作生成的自增主键值,你在插入图片记录后读取该属性即可得到 image_id:

# 为当前图片新增记录,存储图片路径
cursor.execute("INSERT INTO images VALUES (NULL, ?)", (image_path,))
image_id = cursor.lastrowid

关键词ID获取逻辑

你设想的插入后查询的方案完全可用,逻辑简单且稳定性高:由于 keyword 字段有唯一约束,查询速度极快,完全不用纠结额外查询带来的性能损耗。同时建议在插入关联表时也加上 OR IGNORE,避免重复关联同一个图片和关键词时触发主键冲突报错。

修改后的完整代码如下:

# 插入图片记录,获取image_id
cursor.execute("INSERT INTO images VALUES (NULL, ?)", (image_path,))
image_id = cursor.lastrowid

for keyword in keywords:  # keywords变量是字符串列表
    # 关键词不存在则插入,已存在则跳过
    cursor.execute("INSERT OR IGNORE INTO keywords VALUES (NULL, ?);", (keyword,))
    # 查询对应关键词的ID
    row = cursor.execute("SELECT keyword_ID FROM keywords WHERE keyword = ?;", (keyword,)).fetchone()
    keyword_id = row[0]
    # 写入关联关系
    cursor.execute("INSERT OR IGNORE INTO images_keywords VALUES (?, ?);", (image_id, keyword_id))

可选优化方案

如果想要减少一次查询操作,可以通过判断 cursor.rowcount 确认关键词是否是新插入的:如果 rowcount 为1说明是新插入,直接取 cursor.lastrowid 作为关键词ID;否则再执行查询。但日常使用中上述常规写法可读性和可维护性更高,更推荐使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:06:07