Эффективный синтаксический анализ хранилища данных в Python - PullRequest
1 голос
/ 08 марта 2019

Итак, хранилище данных 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 Ответ

1 голос
/ 09 марта 2019

В идеале вы должны получить нужный объект по ключу вместо загрузки всей таблицы.

Немного сложно дать вам точный код, поскольку я не могу сказать, какую библиотеку вы используете для доступа к хранилищу данных. Я всегда использовал 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']

Идентификатор 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")

Вам нужно будет добавить индекс для работы вышеуказанного запроса. Кажется, вы не используете движок приложений, поэтому вам, вероятно, придется добавлять индексы через веб-консоль

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...