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
相关产品推荐
相关产品推荐

