С помощью утилиты массовой загрузки данных, которая включена в состав SDK, становится возможным производить потоковую загрузку данных из файлов CSV и конвертировать их в объекты хранилища приложения. Одновременно при выполнении этой операции можно указать, какие из объектов будут доступны для поиска.
В этой статье мы рассмотрим создание программы, которая производит поиск заданного ключевого слова в данных хранилища. Затем мы покажем, как можно использовать загрузчик для потоковой загрузки данных в наше приложение.
Сначала, давайте напишем программу, которая выполняет поиск заданного ключевого слова в объектах хранилища и возвращает все результаты, которые совпадают с этим словом:
import wsgiref.handlers
from google.appengine.ext import webapp
from google.appengine.ext import search
class MainPage(webapp.RequestHandler):
def get(self):
# Используем фреймворк webapp для получения параметра keyword
keyword = self.request.get('keyword')
self.response.headers['Content-Type'] = 'text/plain'
if not keyword:
self.response.out.write("No keyword has been set")
else:
# Ищем в объектах 'Person' заданное ключевое слово
query = search.SearchableQuery('Person')
query.Search(keyword)
for result in query.Run():
self.response.out.write('%s' % result['email'])
def main():
application = webapp.WSGIApplication([('/', MainPage)],
debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == "__main__":
main()
Все замечательно, огорчает только тот момент, что пока наше приложение не содержит в себе никаких данных! Далее я объясню, как можно организовать загрузку данных в ваше приложение.
Потоковый модуль загрузки данных доступен в пакете google.appengine.ext.bulkload и позволяет вам импортировать в приложение внешние данные. Он выполняет чтение CSV файла, отправляет данные в приложение, которое конвертирует каждую строку файла в отдельный объект и помещает его в хранилище. Дополнительно можно указать загрузчику, какие их объектов следует сделать доступными для поиска.
Для использования этого модуля в приложении, мы создадим загрузчик, который описывает данные с помощью модели. Затем добавим определение обработчика этого загрузчика в файл app.yaml. В завершении, воспользуемся программой tools/bulkload_client.py для проведения загрузки данных в хранилище.
Давайте создадим наш загрузчик данных в файле myloader.py. Код, указанный ниже, определяет загрузчик данных из формата CSV, а также указывает на то, что данные должны быть проиндексированы.
Этот обработчик создает новый класс, который является потомком класса Loader и переопределяет его метод HandleEntity. Наш новый метод HandleEntity будет помечать все объекты как индексируемые.
from google.appengine.ext import bulkload
from google.appengine.api import datastore_types
from google.appengine.ext import search
class PersonLoader(bulkload.Loader):
def __init__(self):
# Наш объект 'Person' содержит строку с именем и адресом электронной почты
bulkload.Loader.__init__(self, 'Person',
[('name', str),
('email', datastore_types.Email),
])
def HandleEntity(self, entity):
ent = search.SearchableEntity(entity)
return ent
if __name__ == '__main__':
bulkload.main(PersonLoader())
Наш CSV файл с данными для загрузки будет выглядеть следующим образом:
John, john@example.com Mary, mary@example.com William, william@example.com ...
Поскольку загрузка данных в приложение будет производиться через метод POST и URL /load, мы должны добавить информацию о новом обработчике из файла myloader.py в конфигурацию приложения в файле app.yaml:
- url: /load script: myloader.py login: admin
Теперь, когда мы подготовили наше приложение и его загрузчик, мы можем запустить его с помощью сервера разработки dev_appserver.py. После того, как приложение будет запущено, мы можем отправлять данные в формате CSV в приложение, после чего они попадут в хранилище.
Утилита для потоковой загрузки входит в состав SDK (tools/bulkload_client.py). Этот скрипт на языке Python осуществляет построчное чтение CSV файла, после чего выполняет загрузку каждой порции данных в приложение. Для загрузки CSV файла (people.csv) в приложение, работающее на сервер разработки, вы можете использовать следующую команду:
./bulkload_client.py --filename people.csv \
--kind Person \
--url http://localhost:8080/load
После чего процесс будет выполнен. Теперь можно перейти по адресу http://localhost:8080/?keyword=William, и мы увидим следующий результат в браузере:
william@example.com