使用 CerealBox 将 AWS DynamoDB JSON 序列化为 Python dict
使用 CerealBox 将 AWS DynamoDB JSON 序列化为 Python dict
在这里,我们讨论了一个快速演练和参考代码,用于为您的下一个 AWS 应用程序简化 DynamoDB JSON 序列化过程。
绒毛在哪里?
当我开始使用 DynamoDB 时,我喜欢它的设置和入门是多么容易,无需担心可扩展性、可扩展性或可用性。直到我在客户端应用程序上创建数据模型时遇到了这个 JSON 序列化问题,一切似乎都井井有条。
“如果你只是坚持公地,事情就会变得如此简单,不是吗?”
好吧,当涉及到我们最喜欢的 AWS 解决方案之一 DynamoDB 数据库时,情况并非如此,这就是它的模糊之处。
数据类型
DynamoDB 固有地支持 3 种数据类型——字符串、数字和二进制——其余的通用数据类型是这些基本类型的简单派生。如果我们尝试用通用 Java 数据类型映射它们,我们会得到如下映射 -
Java 类型 对比 DynamoDB 类型
所有号码类型 - >_ñ_
(数字类型)
字符串->_小号_
(字符串类型)
布尔值 ->_布尔值_
(布尔类型),0 或 1
字节缓冲区->_乙_
(二进制类型)
日期 ->_小号_
_(字符串类型),存储为 ISO-8601 格式的字符串
_ 放 集合类型 - >_党卫军_
(字符串集)类型,_NS_
(数字集)类型,或_学士学位_
(二进制集)类型
Java 映射器参考: Amazon DynamoDB 开发人员指南
我们的设置
为了理解这个问题并演示解决方案,让我们设置一个 DynamoDB 表,其中包含一些关于动画电影的随机数据(只是因为我喜欢它们)。
步骤1 : 创建 dynamodb 表 'movies'
Create dynamodb table ‘ movies ’ with ‘ title ’ as PartitionKey and ‘ genre ’ as SortKey
第2步 :添加具有不同数据类型的示例记录
这可以通过以下两种方式中的任何一种来完成 - 使用表单视图或在 DynamoDB 表的创建项目选项下提供的 JSON 视图
例如,让我们在某些假设下为电影“海兽”添加一条记录 -
Data types for movies table item constituents
Sample movie record added with multiple data types
第 3 步 : 客户端代码设置
现在是 Python 客户端——让我们将其设置为 3 个类的结构,这些类可以进一步扩展以在未来提供额外的特性——
-
DatabaseHelper — DynamoDB 查询的处理程序
-
MovieModel — 数据库调用和响应格式化管理器
-
Main - 这是管理执行流程的地方,将其视为将请求电影详细信息的用户界面
问题
通常,为了在 Python 中将任何响应对象转换为可管理的 json 格式流,我们使用 json.dumps(),这就是我们尝试在 常规方法 在 MovieModel 类中进行了评论。
反序列化尝试
要了解 DynamoDB json 的类型转换问题,请取消注释 常规方法 在 MovieModel 类中并注释 谷物盒方法 .现在运行主文件——
$ python3 main_movie_dynamodb_example_runner.py
观察和例外
这会导致错误 语言 场地 -
TypeError:类型集的对象不是 JSON 可序列化的
出现此问题是因为 StringSet 的输入数据类型无法识别为常规 Java 数据类型导致序列化失败。
解决方案
这个确切的序列化问题由 CerealBox 库管理,该库提供对 DynamoDB JSON 的开箱即用支持。
根据他们的官方简介——
CerealBox 是用于 python 字典的极快的零依赖通用序列化器/反序列化器。它具有可扩展的架构,允许通过 config 构建自定义序列化程序。该模块还包括将常见数据类型序列化为 JSON 兼容字典或 DynamoDB JSON 的内置实现。
参考图书馆: https://github.com/a2d24/cerealbox
使用 CerealBox 库进行序列化
现在在上面的同一个例子中,尝试运行主程序,而 谷物盒方法 未注释并且 常规方法 在 MovieModel 类中被注释。现在,这将以正确的格式序列化响应,并在控制台上打印电影详细信息 -
{'languages': ['Spanish', 'French', 'English'], 'userRating': '4.8', 'isReleased': True, 'releaseYear': '2022', 'genre': 'Adventure' , 'title': '海兽'}
在数据库中找不到电影。
我们现在可以从这个序列化的响应数据中构建数据模型,并在我们的应用程序中像常规 JSON 一样进一步使用它。
CerealBox 使用以下映射将 DynamoDB json 序列化为 Python dict —
DynamoDB JSON to Python Dict mapping done by CerealBox
结论
因此,虽然与 AWS DynamoDB 合作有其自身的优势和劣势,但 CerealBox 让您在迁移/采用云期间能够非常轻松地驾驭复杂的应用程序数据级别。 ❤️
把它包起来
请在评论中分享 你遇到如此低级的设计问题以及大象经历的时候,你在推过那个尾端时会感到头痒。
- — 如果这次快速总结对您有所帮助,请鼓掌
- — 与寻找答案的好奇者分享这篇文章
- ➕ — 按下 跟随 调整更多此类简化的东西 云 , 移动应用程序开发 和 系统
[
汉堡类比:命令式与声明式编程风格
理解历史评估的系统设计范式的基本方法
更好的编程.pub
[
使用 Mosquitto MQTT 代理流式处理 Flutter 事件
通过counter app示例程序探索Flutter中MQTT消息协议的威力
更好的编程.pub
](https://betterprogramming.pub/streaming-flutter-events-with-mosquitto-mqtt-broker-28998a3b81c2)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明