【问题标题】: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 在这种情况下按预期工作。

      请注意,在这种情况下您仍然可以使用属性注释——它们不会冲突,因为它们在底层类构造函数上构建了单独的属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-07
        • 1970-01-01
        • 2021-08-25
        • 2016-02-02
        • 1970-01-01
        • 2012-02-26
        • 1970-01-01
        相关资源
        最近更新 更多