在Python中高效解析数据存储区实体

时间:2019-03-08 08:26:29

标签: firebase nosql google-cloud-datastore datastore

现在,数据存储区ds.query(kind='users')向我返回了以下格式的响应:

<Entity(u'users', 5633378543992832L) {u'username': u'xyz', u'user_ip': '127.0.0.1', u'name': u'xyz', u'password': 'something', u'register_date': datetime.datetime(2019, 3, 8, 5, 50, 1, 443212, tzinfo=<UTC>)}>

尽管我可以这样迭代:

result = {}
for oneItem in query.fetch():
    # oneItem is Entity iterable as shown above
    for oneProp in oneItem:
        result[oneProp] = oneItem[oneProp]

并通过something = result['password']

访问任何属性

哪个工作正常,但效率很低。有什么方法可以直接访问任何特定属性,而无需使用for循环或其他数据结构?类似于访问JSON中的值。

我正在使用from google.cloud import datastore

1 个答案:

答案 0 :(得分:1)

理想情况下,您将通过键检索所需的对象,而不是加载整个表。

为您提供准确的代码有点挑战,因为我无法确定您正在使用哪个库来访问数据存储。我一直使用ndb,但似乎您正在使用这个:

https://googleapis.github.io/google-cloud-python/latest/datastore/index.html

要通过密钥获取,请执行以下操作:

from google.cloud import datastore
from google.cloud.datastore.key import Key
ds = datastore.Client()
oneItem = ds.get(Key(u'users', 5633378543992832L, project=project))

,然后与之交互oneItem['password']

ID 5633378543992832L应该从当前会话中提供给您。因此,您只需要在会话创建期间进行查询。像这样:

def create_session(username, raw_password):
    client = datastore.Client()
    query = client.query(kind=u'users')
    query.add_filter('username', '=', username)
    query.add_filter('password', '=', _your_password_hash_function(raw_password))
    results = query.fetch(1)
    if results:
        return _create_session_for_user(results[0])
    raise Exception("Invalid username/password")

您需要为上述查询添加索引才能正常工作。似乎您没有使用App Engine,因此您可能必须通过Web控制台添加索引