【发布时间】:2015-07-13 16:38:30
【问题描述】:
所以我使用 AWS DynamoDB 是因为它具有 NoSQL 特性,并且可以说具有模糊数量的“列”。为此,我使用 boto 与数据库交互,但动态获取不同数量的列/属性被证明是困难的。
我的 db 表大多没有明确的架构(为什么我要使用 NoSQL),并且大多数行的属性与其他行不同。我知道 Dynamo 可以做到这一点,但我需要一种通过简单扫描获取所有键/列/属性的方法。我的数据库不大,根本不会增长太多,所以我不担心扫描/查询的效率。
我的桌子(或多或少):
{'name': 'John', 'email': '12@34.com'}
{'name': 'Charlie', 'email': '34@56.com', 'dislikes': 'people's knees'}
{'name': 'Joe', 'email': '78@90.com', 'hobby': 'golf'}
如您所见,每一行都有不同的属性。
我的 boto 测试脚本
import os
import boto.dynamodb2
from boto.dynamodb2.table import Table
AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
def connect():
conn = boto.dynamodb2.connect_to_region(
'us-east-1',
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
return conn
conn = connect()
table = Table('table1', connection=conn)
scan = table.scan()
这会返回一个迭代器对象
<boto.dynamodb2.items.Item object at ....>
要解析这个对象,必须知道属性名称,并且该对象不能用数字索引:
for i in scan:
print i['name']
# John
# Charlie
# Joe
for i in scan:
print i[0]
# None
# None
# None
当我使用多个变量进行解包时,它可以工作,但我必须像这样专门定义变量:
for i, j, k in scan:
print i, j, k
这适用于三列但只有三列的行。
我想要做的是遍历每一行并取回其对应的列,这可能与下一行不同。我遇到了困难,非常感谢任何反馈。
【问题讨论】:
标签: python iterator generator amazon-dynamodb boto