【问题标题】:PynamoDB same model with multipe databases具有多个数据库的 PynamoDB 相同模型
【发布时间】:2022-06-21 19:51:16
【问题描述】:

PynamoDB 的实现方式是查看特定的单个 DynamoDB 表:

class UserModel(Model):
    class Meta:
        # Specific table.
        table_name = 'dynamodb-user'
        region = 'us-west-1'

我的基础架构的工作方式是它拥有与我的客户端一样多的 dynamodb 表,因此单个 Lambda 函数必须处理任意数量的结构相同的单独表,例如代表“用户模型”。我无法指定具体的。

如何使这个模型定义动态化?

谢谢!

【问题讨论】:

    标签: python python-3.x amazon-web-services amazon-dynamodb pynamodb


    【解决方案1】:

    可能的解决方案:

    def create_user_model(table_name: str, region: str):
        return type("UserModel", (Model,), {
            "key" : UnicodeAttribute(hash_key=True),
            "range_key" : UnicodeAttribute(range_key=True),
            # Place for other keys
            "Meta": type("Meta", (object,), {
                "table_name": table_name,
                "region": region,
                "host": None,
                "billing_mode": 'PAY_PER_REQUEST',
            })
        })
    UserModel_dev = create_user_model("user_model_dev", "us-west-1")
    UserModel_prod = create_user_model("user_model_prod", "us-west-1")
    

    更新:

    更简洁的版本:

    class UserModel(Model):
        key = UnicodeAttribute(hash_key=True)
        range_key = UnicodeAttribute(range_key=True)
    
        @staticmethod
        def create(table_name: str, region: str):
            return type("UserModelDynamic", (UserModel,), {
                "Meta": type("Meta", (object,), {
                    "table_name": table_name,
                    "region": region,
                    "host": None,
                    "billing_mode": 'PAY_PER_REQUEST',
                })
            })
    

    【讨论】:

    【解决方案2】:

    开源了一个经过测试和工作的解决方案。

    https://github.com/Biomapas/B.DynamoDbCommon/blob/master/b_dynamodb_common/models/model_type_factory.py

    阅读 README.md 了解更多详情。

    代码:

    from typing import TypeVar, Generic, Type
    
    from pynamodb.models import Model
    
    T = TypeVar('T')
    
    
    class ModelTypeFactory(Generic[T]):
        def __init__(self, model_type: Type[T]):
            self.__model_type = model_type
    
            # Ensure that given generic belongs to pynamodb.Model class.
            if not issubclass(model_type, Model):
                raise TypeError('Given model type must inherit from pynamodb.Model class!')
    
        def create(self, custom_table_name: str, custom_region: str) -> Type[T]:
            parent_class = self.__model_type
    
            class InnerModel(parent_class):
                class Meta:
                    table_name = custom_table_name
                    region = custom_region
    
            return InnerModel
    

    【讨论】:

      猜你喜欢
      • 2016-09-10
      • 1970-01-01
      • 2018-01-22
      • 2016-06-16
      • 2023-03-22
      • 2019-01-09
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      相关资源
      最近更新 更多