स्रोत
मुझे इससे मिली http://code.google.com/appengine/articles/remote_api.html ।
इंटरएक्टिव कंसोल बनाएं
सबसे पहले, आपको एक इंटरैक्टिव एपेंनगिंग कंसोल को परिभाषित करने की आवश्यकता है। तो, appengine_console.py नामक एक फ़ाइल बनाएं और इसे दर्ज करें:
#!/usr/bin/python
import code
import getpass
import sys
# These are for my OSX installation. Change it to match your google_appengine paths. sys.path.append("/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine")
sys.path.append("/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/yaml/lib")
from google.appengine.ext.remote_api import remote_api_stub
from google.appengine.ext import db
def auth_func():
return raw_input('Username:'), getpass.getpass('Password:')
if len(sys.argv) < 2:
print "Usage: %s app_id [host]" % (sys.argv[0],)
app_id = sys.argv[1]
if len(sys.argv) > 2:
host = sys.argv[2]
else:
host = '%s.appspot.com' % app_id
remote_api_stub.ConfigureRemoteDatastore(app_id, '/remote_api', auth_func, host)
code.interact('App Engine interactive console for %s' % (app_id,), None, locals())
मैपर आधार वर्ग बनाएँ
एक बार जब यह जगह हो जाए, तो यह मैपर क्लास बनाएं। मैंने अभी एक नया फ़ाइल बनाया है, जिसे utils.py कहा जाता है और इसे फेंक दिया है:
class Mapper(object):
# Subclasses should replace this with a model class (eg, model.Person).
KIND = None
# Subclasses can replace this with a list of (property, value) tuples to filter by.
FILTERS = []
def map(self, entity):
"""Updates a single entity.
Implementers should return a tuple containing two iterables (to_update, to_delete).
"""
return ([], [])
def get_query(self):
"""Returns a query over the specified kind, with any appropriate filters applied."""
q = self.KIND.all()
for prop, value in self.FILTERS:
q.filter("%s =" % prop, value)
q.order("__key__")
return q
def run(self, batch_size=100):
"""Executes the map procedure over all matching entities."""
q = self.get_query()
entities = q.fetch(batch_size)
while entities:
to_put = []
to_delete = []
for entity in entities:
map_updates, map_deletes = self.map(entity)
to_put.extend(map_updates)
to_delete.extend(map_deletes)
if to_put:
db.put(to_put)
if to_delete:
db.delete(to_delete)
q = self.get_query()
q.filter("__key__ >", entities[-1].key())
entities = q.fetch(batch_size)
मैपर केवल एक अमूर्त वर्ग माना जाता है जो आपको किसी भी प्रकार की प्रत्येक इकाई पर पुनरावृत्त करने की अनुमति देता है, हो सकता है कि यह उनके डेटा को निकालने के लिए हो, या उन्हें संशोधित करने और अद्यतित संस्थाओं को डेटास्टोर में वापस संग्रहीत करने के लिए हो।
इसके साथ भागो!
अब, अपना एपेंगिन इंटरैक्टिव कंसोल शुरू करें:
$python appengine_console.py <app_id_here>
यह इंटरैक्टिव कंसोल शुरू करना चाहिए। इसमें मॉडल का एक उपवर्ग बनाएँ:
from utils import Mapper
# import your model class here
class MyModelDeleter(Mapper):
KIND = <model_name_here>
def map(self, entity):
return ([], [entity])
और, अंत में, इसे चलाएं (आप इंटरेक्टिव कंसोल से): मैपर = MyModelDeleter () mapper.run ()
बस!