使用boto3操作多DynamoDB表:主表无用户时先新增再添加技能
Python脚本实现DynamoDB用户存在性校验与技能添加逻辑
核心逻辑
- 用主键精准查询替代扫描,高效判断主表中目标用户是否存在
- 用户不存在时,先向主表插入基础用户数据,再往Skills表添加技能
- 用户已存在时,直接向Skills表插入技能数据
代码实现
import boto3 # 初始化DynamoDB资源 dynamodb = boto3.resource('dynamodb') # 替换为你的实际表名 person_table = dynamodb.Table('Person') skills_table = dynamodb.Table('Skills') def add_skill(person_id, skill_info): # 1. 检查主表用户是否存在 try: resp = person_table.get_item(Key={'personId': person_id}) user_exists = 'Item' in resp except Exception as e: print(f"查询用户状态出错: {str(e)}") return # 2. 用户不存在则创建主表记录 if not user_exists: try: # 按你的主表结构补充必填字段 person_table.put_item( Item={ 'personId': person_id, 'name': skill_info.get('user_name', '未知用户'), 'createdAt': str(person_table.meta.client.get_time()) } ) print(f"已创建用户 {person_id}") except Exception as e: print(f"创建用户失败: {str(e)}") return # 3. 向Skills表添加技能 try: skills_item = { 'personId': person_id, 'skillId': skill_info['skill_id'], # 匹配Skills表主键/排序键 'skillName': skill_info['skill_name'], 'proficiency': skill_info.get('proficiency', '入门'), 'updatedAt': str(skills_table.meta.client.get_time()) } skills_table.put_item(Item=skills_item) print(f"技能 {skill_info['skill_name']} 已添加给用户 {person_id}") except Exception as e: print(f"添加技能失败: {str(e)}") # 调用示例 if __name__ == '__main__': test_skill = { 'skill_id': 'SKILL_001', 'skill_name': 'Python开发', 'proficiency': '精通', 'user_name': '张三' } add_skill('PERSON_001', test_skill)
关键注意事项
- 务必使用
get_item查询用户:相比全表扫描,主键查询性能提升极大,符合DynamoDB最佳实践 - 主表插入字段需严格匹配你的表结构,确保包含所有必填属性
- Skills表的外键(如
personId)必须与主表主键保持一致,保证关联关系有效 - 若需强一致性,可改用
transact_write_items实现事务,避免用户创建成功但技能添加失败的情况
内容的提问来源于stack exchange,提问作者Xrayman
相关产品推荐
相关产品推荐

