【问题标题】:how to dynamically set table name in dynamodb using serverless and DynamoDBContext?如何使用无服务器和 DynamoDBContext 在 dynamodb 中动态设置表名?
【发布时间】:2018-09-21 09:43:12
【问题描述】:

我们需要能够根据构建环境设置表名。考虑以下类:

[DynamoDBTable("movies")]
public class Movie
{
    [DynamoDBHashKey]
    public string Title { get; set; }

    [DynamoDBRangeKey(AttributeName = "Released")]
    public DateTime ReleaseDate { get; set; }

    public List<string> Genres { get; set; }
}

serverless.yml中,表名可以这样设置吗:

functions:
    update-movies:
        environment:
            tableName: movies-prod

然后在代码中我们可以根据tableName变量中的表名动态加载表名。我们更喜欢使用DynamoDBContext 而不是DynamoDBv2.DocumentModel(这里已经有解决方案How do I dynamically change dynamodb tablename in c# using object persistence model

在 Java 中是这样的: https://medium.com/@onclouds/aws-lambda-use-different-dynamodb-tables-for-different-stages-5eda9f5378b2

【问题讨论】:

  • 你真的问过问题吗? How to Ask您的问题被视为一组要求
  • 是的,只需编辑标题以反映这一点。谢谢。

标签: c# amazon-web-services amazon-dynamodb


【解决方案1】:

通过传递表名前缀找到了解决方案:

DynamoDBContextConfig config = new DynamoDBContextConfig()
{
    TableNamePrefix = "prod-"
};

_dynamoDBContext = new DynamoDBContext(new AmazonDynamoDBClient(), config);

您仍然必须将您的表命名为 movies

[DynamoDBTable("movies")]
public class Movie

DynamoDBContext 会在加载上下文时为表名添加前缀。所以它会尝试加载prod-moviesstag-movies

这里是 AWS 开发工具包内部使用表前缀的地方

if (!string.IsNullOrEmpty(flatConfig.TableNamePrefix))
    tableName = flatConfig.TableNamePrefix + tableName;

(https://github.com/aws/aws-sdk-net/blob/b691e46e57a3e24477e6a5fa2e849da44db7002f/sdk/src/Services/DynamoDBv2/Custom/DataModel/ContextInternal.cs)

一些帮助我找到解决方案的参考资料:

https://aws.amazon.com/blogs/developer/enhancements-to-the-dynamodb-sdk/

https://github.com/aws/aws-sdk-net/blob/b691e46e57a3e24477e6a5fa2e849da44db7002f/sdk/test/Services/DynamoDBv2/UnitTests/Custom/DynamoDBTests.cs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2010-11-04
    • 2021-01-29
    • 1970-01-01
    相关资源
    最近更新 更多