aws-sdk-go-v2 是官方推荐且维护活跃的 SDK,新项目必须使用 v2;v1 已维护模式,混用会导致字段丢弃或 ValidationException 错误。

用 aws-sdk-go-v2 连 DynamoDB,别碰 v1
Go 官方推荐且维护活跃的是 aws-sdk-go-v2,v1 已进入维护模式,新项目硬切 v2 是唯一合理选择。v1 的 dynamodbattribute 序列化逻辑和 v2 的 attributevalue 不兼容,混用会导致结构体字段静默丢弃或 ValidationException: Invalid null value for attribute 这类诡异错误。
- 初始化客户端必须传
region,哪怕用us-east-1—— DynamoDB 不支持全局 endpoint,区域错直接报NotFound或ResourceNotFoundException - 本地开发用
DynamoDB Local时,endpoint 要显式设为http://localhost:8000,SDK 不会自动 fallback - 别信文档里 “default credentials” 的模糊描述:确保
AWS_PROFILE或~/.aws/credentials有对应 profile,否则连 IAM role 都拿不到凭据
PutItem 写入失败常见原因:空值、类型错、主键缺失
DynamoDB 对写入极其严格,PutItem 失败几乎全是 schema 层面问题,不是网络或权限问题。
-
ValidationException: One or more parameter values were invalid: An AttributeValue may not contain an empty string—— 字段值是空字符串"",DynamoDB 禁止空字符串,要么删字段,要么改用null(即 Go 中的nil指针) - 结构体字段没加
dynamodbavtag,比如type User struct { Name string },Name不会进表;正确写法是Name string `dynamodbav:"name"` - 主键字段(Partition Key + Sort Key)值为
nil或零值,例如ID int为 0,会被序列化成{"N": "0"},但若 schema 要求非零,就触发校验失败
查单条用 GetItem,别用 Query 或 Scan
按主键精确查一条,GetItem 是唯一高效方式。Query 必须带 Partition Key,Scan 全表扫 —— 两者在数据量稍大时延迟飙升、费用翻倍,还容易触发 ProvisionedThroughputExceededException。
-
GetItem的Key参数必须是 map[string]types.AttributeValue,不能直接传结构体;用attributevalue.MarshalMap转,别手写 map - 查不到返回空响应(
output.Item == nil),不是 error;别把err == nil && len(output.Item) == 0当异常处理 - 如果要查多个主键,
BatchGetItem比循环调GetItem快 5–10 倍,但单次最多 100 个 key,且所有 key 必须同表
结构体字段类型映射:string/int/bool 之外的坑
DynamoDB 原生类型有限,Go 结构体字段类型稍不匹配,序列化就出错,尤其时间、切片、嵌套结构体。
立即学习“go语言免费学习笔记(深入)”;
-
time.Time必须用UnixMilli()存为int64,或用Format("2006-01-02T15:04:05Z")存为string;直接存time.Time会 panic -
[]string可以,但[]int不行 —— DynamoDB 没有 number list 类型,得转成[]interface{}或用attributevalue.MarshalList - 嵌套结构体必须加
dynamodbavtag,且子字段也要 tag;漏一个,整个嵌套字段消失,无警告
最常被忽略的是:DynamoDB 的 NULL 和 Go 的 nil 指针不是一回事。想存 null,字段类型得是指针(*string),值为 nil;普通 string 字段即使为空,也会存成空字符串,而空字符串是非法值。










