现在,数据存储区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
答案 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控制台添加索引