点击上方卡片关注我
设置星标 学习更多技能
Amazon DynamoDB是AWS提供的高性能NoSQL数据库服务,具有低延迟、高可扩展性等特点,被广泛应用于各种云应用中。然而,DynamoDB的原生API相对底层,使用起来较为繁琐。PynamoDB是一个专为DynamoDB设计的Python库,它提供了类似Django ORM的Pythonic接口,让开发者能够以面向对象的方式操作DynamoDB。
PynamoDB的安装非常简单,使用pip包管理器即可完成:
pip install pynamodb安装完成后,可以通过以下代码验证是否安装成功:
import pynamodbprint(pynamodb.__version__)如果能够正常输出版本号,说明安装成功,使用PynamoDB需要配置AWS凭证,可以通过环境变量、AWS配置文件或在代码中直接指定。
在PynamoDB中,通过继承Model类来定义数据模型,每个模型对应DynamoDB中的一张表。模型类中定义的属性对应表的字段,需要指定属性类型和是否为主键,定义好模型后,可以使用create_table方法创建表。
from pynamodb.models import Modelfrom pynamodb.attributes import UnicodeAttribute, NumberAttributeclassUserModel(Model):"""用户模型"""classMeta: table_name = 'users' region = 'us-west-2'# 定义主键 user_id = UnicodeAttribute(hash_key=True)# 定义属性 username = UnicodeAttribute() age = NumberAttribute() email = UnicodeAttribute()# 创建表(如果不存在)ifnot UserModel.exists(): UserModel.create_table( read_capacity_units=5, write_capacity_units=5, wait=True ) print('表创建成功')PynamoDB提供了简洁的API来插入和查询数据。创建模型实例并调用save方法即可插入数据,使用get方法可以根据主键查询单条记录。
from pynamodb.models import Modelfrom pynamodb.attributes import UnicodeAttribute, NumberAttribute# 插入数据user = UserModel( user_id='user001', username='张三', age=25, email='zhangsan@example.com')user.save()print('用户创建成功')# 查询单条数据try: user = UserModel.get('user001') print(f'用户名: {user.username}') print(f'年龄: {user.age}') print(f'邮箱: {user.email}')except UserModel.DoesNotExist: print('用户不存在')当需要查询多条记录或根据非主键字段查询时,可以使用scan方法扫描表,PynamoDB提供了丰富的过滤条件,可以根据属性值进行筛选,虽然扫描操作会遍历整个表,性能相对较低,但对于小型表或不频繁的查询来说是可接受的。
# 扫描所有用户for user in UserModel.scan(): print(f'{user.username}: {user.email}')# 使用过滤条件for user in UserModel.scan(UserModel.age > 20): print(f'{user.username}的年龄是{user.age}')# 多个过滤条件for user in UserModel.scan( (UserModel.age > 20) & (UserModel.username.contains('张'))): print(f'找到用户: {user.username}')全局二级索引(GSI)可以使用非主键字段进行高效查询。在模型中定义索引类,指定索引的键和投影属性,就可以使用索引进行查询。索引查询比扫描操作快得多,特别适合需要频繁查询的场景。
from pynamodb.models import Modelfrom pynamodb.indexes import GlobalSecondaryIndex, AllProjectionfrom pynamodb.attributes import UnicodeAttribute, NumberAttributeclassEmailIndex(GlobalSecondaryIndex):"""邮箱索引"""classMeta: index_name = 'email-index' read_capacity_units = 5 write_capacity_units = 5 projection = AllProjection() email = UnicodeAttribute(hash_key=True)classUserModel(Model):classMeta: table_name = 'users' region = 'us-west-2' user_id = UnicodeAttribute(hash_key=True) username = UnicodeAttribute() age = NumberAttribute() email = UnicodeAttribute() email_index = EmailIndex()# 使用索引查询for user in UserModel.email_index.query('zhangsan@example.com'): print(f'找到用户: {user.username}')当需要处理大量数据时,批量操作可以显著提高性能,PynamoDB提供了batch_write和batch_get方法来批量插入、更新和查询数据。批量操作会自动处理DynamoDB的批量限制,将大批量操作分割成多个小批次执行。
from pynamodb.models import Model# 批量写入with UserModel.batch_write() as batch:for i in range(100): user = UserModel( user_id=f'user{i:03d}', username=f'用户{i}', age=20 + i % 30, email=f'user{i}@example.com' ) batch.save(user)print('批量写入完成')# 批量读取user_ids = ['user001', 'user002', 'user003']for user in UserModel.batch_get(user_ids): print(f'{user.username}: {user.email}')PynamoDB提供了多种方式来更新和删除数据。可以先查询记录,修改属性后保存,也可以使用update方法进行原子更新。删除操作同样简单,调用delete方法即可,原子更新操作特别适合需要保证数据一致性的场景,如计数器增减、条件更新等。
# 更新数据user = UserModel.get('user001')user.age = 26user.save()print('用户信息已更新')# 原子更新(增加年龄)user.update(actions=[ UserModel.age.set(UserModel.age + 1)])# 条件更新user.update( actions=[UserModel.email.set('newemail@example.com')], condition=(UserModel.age > 20))# 删除数据user = UserModel.get('user001')user.delete()print('用户已删除')DynamoDB支持事务操作,PynamoDB也提供了相应的API,事务可以确保多个操作要么全部成功,要么全部失败,保证数据的一致性。
from pynamodb.transactions import TransactWrite# 事务写入with TransactWrite(connection=UserModel._get_connection()) as transaction:# 创建新用户 user1 = UserModel( user_id='user100', username='李四', age=30, email='lisi@example.com' ) transaction.save(user1)# 更新现有用户 user2 = UserModel.get('user001') user2.age = 27 transaction.save(user2)# 删除用户 user3 = UserModel.get('user002') transaction.delete(user3)print('事务执行成功')PynamoDB是Python生态中操作AWS DynamoDB的优秀库,它通过Pythonic的API设计让DynamoDB的使用变得简单直观。通过本文的介绍,我们了解了PynamoDB的安装方法、核心特性以及各种实用功能。从基础的模型定义和数据操作,到高级的索引查询和事务处理,PynamoDB都提供了完善的解决方案。它的面向对象设计、自动类型转换、批量操作等特性大大提高了开发效率,减少了样板代码。在云原生应用开发中,特别是使用AWS服务的项目,PynamoDB能够显著简化数据库操作,让开发者专注于业务逻辑而非底层细节。
如果在编程工具充值使用上遇到麻烦,推荐一个牛逼的中转工具!一次性搞定 Codex 、Claude Code和 gemini,内容介绍和付费兑换详见文末阅读原文。


实测 4 个爆火 Skill,一句话生成画布/知识库/任务规划/自动发布
从海外公司注册到 Stripe 收款,跑通了出海收付款全流程(实操分享)
出海建站必备:告别AI味,这两个页面设计 Skills 太牛了!