#python #google-app-engine #google-cloud-datastore
#python #google-app-engine #google-облачное хранилище данных
Вопрос:
У меня есть список примерно из 20 объектов, и для каждого объекта я возвращаю список из 10 словарей.
Я пытаюсь сохранить список из 10 словарей для каждого объекта в списке в GAE; Я не думаю, что я правильно пишу код для сохранения этой информации в GAE.
Вот что у меня есть: Перед моим основным обработчиком запросов у меня есть этот класс:
class Tw(db.Model):
tags = db.ListProperty()
ip = db.StringProperty()
В моем основном обработчике запросов у меня есть следующее:
for city in lst_of_cities: # this is the list of 20 objects
dict_info = hw12.twitter(city) # this is the function to get the list of 10 dictionaries for each object in the list
datastore = Tw() # this is the class defined for db.model
datastore.tags.append(dict_info) #
datastore.ip = self.request.remote_addr
datastore.put()
data = Data.gql("") #data entities we need to fetch
Я не уверен, что этот код вообще записывается. Если кто-нибудь может, пожалуйста, помочь, это было бы очень ценно.
Комментарии:
1. Похоже, ваш список довольно статичен. Почему бы просто не сохранить это в коде или файле данных?
Ответ №1:
Добро пожаловать в Stack Overflow!
Я вижу несколько проблем:
- Словари не являются поддерживаемыми типами значений для свойств App Engine.
- Вы сохраняете только последний объект; остальные отбрасываются.
- Вы используете свойство ListProperty, но вместо добавления каждого элемента dict_info вы выполняете одно добавление всего списка.
Поскольку вы не можете сохранить необработанный словарь внутри свойства, вам нужно сериализовать его в какой-либо другой формат, например JSON или pickle. Вот пересмотренный пример с использованием pickle:
from google.appengine.ext import db
import pickle
class Tw(db.Model):
tags = db.BlobProperty()
ip = db.StringProperty()
entities = []
for city in lst_of_cities:
dict_info = hw12.twitter(city)
entity = Tw()
entity.tags = db.Blob(pickle.dumps(dict_info))
entity.ip = self.request.remote_addr
entities.append(entity)
db.put(entities)
Когда вы извлекаете объект позже, вы можете получить свой список словарей с помощью pickle.loads(entity.tags)
.
Ответ №2:
Когда я имею дело с типами данных, которые напрямую не поддерживаются Google App Engine, такими как словари или пользовательский тип данных, я обычно использую handy PickleProperty
.
from google.appengine.ext import db
import pickle
class PickleProperty(db.Property):
def get_value_for_datastore(self, model_instance):
value = getattr(model_instance, self.name, None)
return pickle.dumps(value)
def make_value_from_datastore(self, value):
return pickle.loads(value)
После объявления PickleProperty
класса в вашем commons.py
модуле вы можете использовать его для хранения ваших пользовательских данных примерно таким образом:
from google.appengine.ext import db
from commons import PickleProperty
class Tw(db.Model):
tags = PickleProperty()
ip = db.StringProperty()
entities = []
for city in lst_of_cities:
dict_info = hw12.twitter(city)
entity = Tw()
entity.tags = dict_info
entity.ip = self.request.remote_addr
entities.append(entity)
db.put(entities)
Для извлечения данных обратно перейдите с:
entity.tags
Ответ №3:
С тех пор, как это было написано, движок приложений выпустил свою экспериментальную модель базы данных Python «ndb», которая содержит, в частности, свойство JsonProperty, то, что довольно хорошо непосредственно реализует то, что вы хотите.
Теперь вам нужно запустить версию App Engine на Python 2.7, которая все еще не совсем готова к производству, но в наши дни все кажется довольно стабильным, сам GvR, похоже, пишет много кода, что говорит о хорошем качестве кода, и я собираюсь использовать это в производстве где-то в этом году…