DynamoDB 表达式构建器
选择一个操作,可视化构建请求,然后以 AWS SDK v3、CLI、boto3 或 PartiQL 形式复制一条正确、对保留字安全的表达式 —— 连同它的 ExpressionAttributeNames 和 Values。
为什么手写 DynamoDB 表达式容易出错
DynamoDB 请求很少在显而易见的部分出错。它出错的原因往往是:status 是保留字需要 #-别名,数字 id 被当作字符串发送而匹配不到任何内容,或者 FilterExpression 和 ConditionExpression 复用了同一个 :v0 占位符。这些都是小错误,会生成一个能运行却返回错误行的请求 —— 这是最难调试的那种。
本构建器基于一个带类型的模型组装整个请求。每个属性名都有别名,每个值都带有显式的 DynamoDB 类型,键、筛选、条件和更新占位符各处于独立的命名空间,因此从构造上就不可能发生冲突。输出依据类型标签构建,而非从你的文本中猜测 —— 数字仍是数字,base64 字符串仍是二进制。
更新表达式和条件写入也获得同样的处理:原子计数器、if_not_exists、list_append、对列表索引的 REMOVE、对集合的 ADD/DELETE,以及乐观锁条件,全部组装成一个正确的 UpdateExpression 和 ConditionExpression。PartiQL 标签页很诚实 —— 当某个原语没有 PartiQL 形式时,它会告诉你是哪一个,而不是生成一条会悄悄出错的语句。
还在 Query 和 Scan 之间犹豫? Query 与 Scan 对比 讲解两者的区别,而 PartiQL 示例 则深入讲解这种类 SQL 的语法。
常见问题
什么是 ExpressionAttributeName,为什么要用 # 和 : 前缀?
DynamoDB 表达式不能直接引用属于保留字的属性名(如 name、status 或 size),而值占位符可以让实际数据不出现在表达式字符串中。因此每个属性名都在 ExpressionAttributeNames 中用 #-占位符做别名,每个值都在 ExpressionAttributeValues 中用 :-占位符表示。本构建器会为你生成这些映射,因此保留字绝不会破坏你的请求。
为什么我必须为每个值选择一个类型(S、N、B…)?
DynamoDB 在属性级别带类型:数字 5 是 { "N": "5" },而字符串 "5" 是 { "S": "5" } —— 它们是匹配不同项的不同值。文本输入框无法区分二者,因此构建器要求你为每个值打上标签。生成的 SDK、CLI、boto3 和 PartiQL 输出都依据该标签构建,绝不会从文本中猜测,因此数字 id 仍是数字,base64 二进制数据仍是二进制。
它能构建更新表达式和条件写入吗?
可以。更新涵盖 SET(包括 if_not_exists、原子 +/- 计数器和 list_append)、REMOVE(包括像 #a[2] 这样的列表索引)、ADD(数字或集合)和 DELETE(集合成员)—— 合并为一个 UpdateExpression。条件写入会向 Update、Put 或 Delete 添加一个 ConditionExpression 以实现乐观锁(attribute_not_exists、版本检查等)。键条件和值条件使用各自独立的占位符命名空间,因此它们绝不会冲突。
为什么 PartiQL 有时“无法表示”?
PartiQL 涵盖了大多数读写操作,但少数 DynamoDB 原语没有对应的 PartiQL 形式:条件 INSERT、集合类型的 ADD/DELETE 更新操作,以及 size()、list_append 和 if_not_exists 等函数。当你的请求用到其中之一时,PartiQL 标签页会准确告诉你哪个功能无法表示,而不是生成一条会悄悄做错事的语句 —— 对于这些情况请改用 SDK、CLI 或 boto3 输出。
我的数据会离开浏览器吗?
不会。本构建器完全在客户端运行 —— 它在你的浏览器中生成表达式和代码片段,你输入的任何内容都不会发送到服务器。URL 的“复制链接”功能会将你的请求序列化进链接本身,便于你分享或加入书签,但它始终掌握在你自己手中。