【问题标题】:Override table name when using Amazon DynamoDB DataMapper for JavaScript使用适用于 JavaScript 的 Amazon DynamoDB DataMapper 时覆盖表名称
【发布时间】:2021-10-27 08:42:58
【问题描述】:
我正在使用 Amazon DynamoDB DataMapper For JavaScript 将一些模型映射到 node.js (TypeScript) lambda 函数中的 DynamoDB 表。我正在使用如下注释:
@table('Foo')
export class Foo {
@hashKey()
id: string;
@attribute()
name: string;
}
有谁知道如何覆盖表名以便指定不同的数据库?例如,对于开发/生产环境,这可能会有所不同。我在 DataMapper 或 DynamoDB 配置对象上看不到任何选项。
谢谢
【问题讨论】:
标签:
node.js
amazon-web-services
aws-lambda
amazon-dynamodb
【解决方案1】:
当您定义映射器时,您可以根据环境放置一个前缀。我将 dev_ 用于开发数据库,并且在生产中没有前缀:
const prefix = process.env.NODE_ENV != "production" ? _dev : ""
const mapper = new DataMapper({
client: new DynamoDB({region: 'us-west-2'}), // the SDK client used to execute operations
tableNamePrefix: prefix // optionally, you can provide a table prefix to keep your dev and prod tables separate
});
【解决方案2】:
如果您愿意避免使用 @table 注释,那么您可以实现自己的自定义属性 getter,如 DataMapper documentation 所示(在撰写本文时,Getting Started 中的第二个代码块)。
请注意,示例(使用this.id)有点误导:在put/update/delete 情况下(您通常会构造一个记录对象以提供给DataMapper)您将能够设置@987654325 @ 或您用来计算表名的任何其他字段。但是在查询/扫描的情况下,DataMapper 使用您提供的构造函数来构建结果对象,您将没有这个机会。在给定的示例中,this.id 将在扫描或查询中未定义。您需要确保您的 DynamoDbTable getter 在这种情况下按预期工作。
请注意,在这种情况下您仍然可以使用属性注释——它们不会冲突,因为它们在底层类构造函数上构建了单独的属性。