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

Firebase 在Python中高效解析数据存储实体,firebase,nosql,google-cloud-datastore,datastore,Firebase,Nosql,Google Cloud Datastore,Datastore,现在,datastoreds.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

现在,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>)}>
并通过
something=result['password']访问任何属性

它工作正常,但效率极低。是否有任何方法可以直接访问任何特定属性而不使用for循环或其他数据结构?类似于在JSON中访问值


我正在使用google.cloud导入数据存储中的
,理想情况下,您应该通过键检索所需的对象,而不是加载整个表

给您提供精确的代码有点困难,因为我无法告诉您使用哪个库访问数据存储。我一直在使用
ndb
,但您似乎正在使用这个:

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

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
。因此,您只需要在会话创建期间进行查询。大概是这样的:

result = {}
for oneItem in query.fetch():
    # oneItem is Entity iterable as shown above
    for oneProp in oneItem:
        result[oneProp] = oneItem[oneProp]
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控制台添加索引

您想在示例中说明什么?for循环不断用下一个实体覆盖
result
中的值。您实际上就是这样做的:
result=query.fetch()[-1]
ahh是的,在我的例子中,它只会有一个实体,我也不知道如何直接访问它。query.fetch()不支持索引。如果是的话,我就不会发布这个问题了。谢谢。它在当地起了作用。但事实证明,GAE只支持标准env中的ndb,这在两者中似乎更好。