Nguồn
Tôi lấy cái này từ http://code.google.com/appengine/articles/remote_api.html .
Tạo Bảng điều khiển tương tác
Trước tiên, bạn cần xác định một bảng điều khiển appengenge tương tác. Vì vậy, hãy tạo một tệp có tên appengine_console.py và nhập vào:
#!/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())
Tạo lớp cơ sở Mapper
Khi đã sẵn sàng, hãy tạo lớp Mapper này. Tôi vừa tạo một tệp mới có tên utils.py và ném tệp này:
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)
Mapper được cho là chỉ là một lớp trừu tượng cho phép bạn lặp lại mọi thực thể của một loại nhất định, có thể là trích xuất dữ liệu của chúng hoặc sửa đổi chúng và lưu trữ các thực thể đã cập nhật trở lại kho dữ liệu.
Chạy với nó!
Bây giờ, hãy khởi động bảng điều khiển tương tác appengine của bạn:
$python appengine_console.py <app_id_here>
Điều đó sẽ bắt đầu bảng điều khiển tương tác. Trong đó, tạo một lớp con của Model:
from utils import Mapper
# import your model class here
class MyModelDeleter(Mapper):
KIND = <model_name_here>
def map(self, entity):
return ([], [entity])
Và cuối cùng, hãy chạy nó (từ bảng điều khiển tương tác của bạn): mapper = MyModelDeleter () mapper.run ()
Đó là nó!