【问题标题】:How can I use AWS's Dynamo Db with Django?如何将 AWS Dynamodb 与 Django 结合使用?
【发布时间】:2019-09-22 09:26:50
【问题描述】:

我正在使用 Django MVC 框架开发 Web 应用程序、API 和后端。 Django 的一个主要方面是它对模型的 ORM 的实现。这是一个非常好的 ORM。通常在使用 Django 时,人们会利用现有的接口将自己的 Django 模型映射到特定的 DBMS,例如 Postgres、MySQL 或 Oracle。

我有一些关于性能和可扩展性的特定需求和要求,所以我真的很想使用 AWS 的 Dynamo DB,因为它具有很高的成本效益、非常高性能且可扩展性非常好。

虽然我认为 Django 允许人们为 DBMS 实现自己的接口(如果愿意),但在构建自己的 Django 模型(如果存在)时能够使用现有的 DBMS 接口显然是有利的。

有人可以推荐一个 Django 模型接口,以便我可以在 Django 中构建一个使用 AWS 的 Dynamo DB 的模型吗?

使用 MongoDB 怎么样?

【问题讨论】:

  • Afaik,DyanmoDB 没有 Django DB 后端; MongoDB 的数据库后端有第三方 (django-mongodb-engine.readthedocs.io/en/latest)。还有可能派上用场的 PynamoDB (github.com/pynamodb/PynamoDB)。
  • 一个很好的问题 - Django 缺乏官方的 NoSQL ORM 支持正在成为一种负担。诚然,并不是所有的 NoSQL 都是相似的,但支持说大 5 就像它们支持各种风格的 SQL(maria、postgres、mysql、oracle、sqlite)会很好。作为一个仅供参考 - 我经常使用 Djongo for Django 和 MOngoDB。它工作得很好,但仅限于 Mongodb。

标签: python django orm nosql amazon-dynamodb


【解决方案1】:

您可以尝试 Dynamorm 或 pynamoDB。我没试过,也许他们能帮上忙。

【讨论】:

    【解决方案2】:

    正如其他人所写,Django 没有 NoSQL DBMS。有第三方包,但鉴于 NoSQL 数据的灵活性,没有像 @slajma 所说的“现成电池”。

    PynamoDB 看起来不错,我没用过,所以不推荐。在所有用例中,我遇到的 boto3 就足够了。设置非常简单,但魔鬼在细节上(准确地说是数据结构和嵌套程度)。基本上,需要三个步骤:

    1. 连接 db 并执行您想要的操作 (boto3)
    2. 将传入的数据解析为 Python 字典(例如,使用 dynamodb-jsonboto3.dynamodb.types.TypeDeserializer 或者您可以构建自己的)
    3. 执行业务逻辑,使用 Django ORM 或任何您需要的东西将数据存储到关系数据库中

    最简单的例子:

    from dynamodb_json import json_util as dynamodb_json
    from .models import YourModel
    
    def get(request, partition_key):
        table = boto3.resource(
            'dynamodb',
            aws_access_key_id=...,
            aws_secret_access_key=...,
            region_name=...,
        ).Table(some_table_name)
        try:
            response = table.get_item(
                Key={partition_key: partition_key})
        except ClientError as e:
            logger.warning(e.response['Error']['Message'])
        else:
            data_str = response['Item']
            _data_dict = dynamodb_json.loads(data_str)
    
            # Validation and modification of incoming data goes here.
            data_dict = validation_and_modification(_data_dict)
            # Then you can do whatever you need, for example:
            obj, created = YourModel.objects.update_or_create(**data_dict)
            ...
    

    希望这对某人有所帮助。可以在serverless repo 中找到创建、删除、列出和更新视图的示例。

    【讨论】:

      【解决方案3】:

      DynamoDB 是非关系型的,我认为这使得它在架构上与 Django 之类的 ORM 不兼容。

      【讨论】:

      • 您可以使用任何具有兼容 ORM 并在 settings.py 中正确配置的数据库。例如 MongoDB。
      • @wowkin2 当然,你可以使用任何你想要的 ORM。不过,OP 询问是否将 Django ORM 与非关系后端一起使用,这从根本上是不兼容的,正如 rcx 在此答案中正确指出的那样。
      【解决方案4】:

      它不像 django 的现成电池,但无论如何都值得一看。 https://github.com/pynamodb/PynamoDB

      【讨论】:

      • 我被 PynamoDB 的文档弄糊涂了。 PynamoDB 是基于 boto、boto3 还是 botocore?在 boto3 上使用 PynamoDB 有缺点吗?我试图弄清楚使用 boto3 或 PynamoDB 是否更好。谢谢!
      • PynamoDB 在后台使用botocore - github.com/pynamodb/PynamoDB/blob/master/setup.py#L5 如果您想编写自己的函数来读取/写入记录,那么您可以使用 boto3。我尝试了 PynamoDB,它在我的用例中运行良好。
      • 感谢您的回复!我很感激。
      【解决方案5】:

      AWS DynamoDB 没有 Django 模型接口,但您可以使用 AWS 提供的 boto3 软件从该类型的 db 中检索数据。

      【讨论】:

        猜你喜欢
        • 2019-07-19
        • 2019-08-17
        • 1970-01-01
        • 2020-07-30
        • 1970-01-01
        • 1970-01-01
        • 2021-08-22
        • 2021-09-20
        相关资源
        最近更新 更多