Amazon

2011年3月21日月曜日

GAE上のデータストアからデータを消す方法

GAEからデータを削除する方法は公式ドキュメントによれば以下の方法で削除できる。

q = db.GqlQuery("SELECT * FROM Message WHERE create_date < :1", earliest_date)
results = q.fetch(10)
for result in results:
  result.delete()

# or...

q = db.GqlQuery("SELECT * FROM Message WHERE create_date < :1", earliest_date)
results = q.fetch(10)
db.delete(results)


但し、GQLには以下の制限があって、保存してあるデータ量が多いと消えない可能性がある。
  • 一定時間内にリクエストを返すべし
  • 一度に取り出せる量が1000件まで
  • 使えるリソースの上限を超えた
そこでこちらのサイトを参考にしながら、制限を超えないように一回で100件消すリクエストを発行するpythonのスクリプトを作り、全部消えるまで自動でリロードするようにする。
getMyData, getMyURLを自分のGAEデータモデルに変更すること。

  1. from google.appengine.ext import webapp  
  2. from google.appengine.ext import db  
  3. from google.appengine.ext.webapp.util import run_wsgi_app  
  4.   
  5.   
  6. class MyData1(db.Model):  
  7.     pass  
  8.   
  9. class MyData2(db.Model):  
  10.     pass  
  11.   
  12.   
  13. class AbstractRemoveAll(webapp.RequestHandler):  
  14.   
  15.     def get(self) :  
  16.   
  17.         #limit = 50  
  18.         limit = 100  
  19.         list  = self.getMyList(limit)  
  20.   
  21.     if list==None :  
  22.             self.response.headers['Content-Type'] = 'text/plain'  
  23.             self.response.out.write( 'Error.' )  
  24.             return   
  25.   
  26.         if len(list)<1:  
  27.             self.response.headers['Content-Type'] = 'text/plain'  
  28.             self.response.out.write( 'OK remove all data.' )  
  29.             return   
  30.   
  31.   
  32.         for c in list:  
  33.             c.delete()  
  34.   
  35.         self.response.headers['Content-Type'] = 'text/html'  
  36.         self.response.out.write( '<html>' )  
  37.         self.response.out.write( '<head>' )  
  38.         self.response.out.write( '<META HTTP-EQUIV="REFRESH" CONTENT="10;URL='+self.getMyUrl()+'">')  
  39.         self.response.out.write( '</head>' )  
  40.         self.response.out.write( '<body>' )  
  41.         self.response.out.write( '<p>' )  
  42.         self.response.out.write( len(list) )  
  43.         self.response.out.write( '</p>' )  
  44.         self.response.out.write( 'Again after 10seconds.' )  
  45.         self.response.out.write( '</body>' )  
  46.         self.response.out.write( '</html>' )  
  47.   
  48.   
  49.     def getMyUrl(self) :  
  50.         return '/RemoveAll'  
  51.   
  52.     def getMyList(self,limit):  
  53.         return []  
  54.   
  55.   
  56. class RemoveAll1(AbstractRemoveAll):  
  57.     def getMyUrl(self) :  
  58.         return '/RemoveAll1'  
  59.   
  60.     def getMyList(self,limit):  
  61.         q=MyData1.gql('LIMIT '+str(limit))  
  62.     return q[0:min(q.count(),limit)]  
  63.   
  64. class RemoveAll2(AbstractRemoveAll):  
  65.     def getMyUrl(self) :  
  66.         return '/RemoveAll2'  
  67.   
  68.     def getMyList(self,limit):  
  69.         q=MyData2.gql('LIMIT '+str(limit))  
  70.     return q[0:min(q.count(),limit)]  
  71.   
  72.   
  73.   
  74. application = webapp.WSGIApplication(  
  75.     [  
  76.         ('/RemoveAll2', RemoveAllPage2),  
  77.         ('/RemoveAll1', RemoveAllPage1)  
  78.     ],  
  79.     debug=True)  
  80.   
  81.   
  82. def main():   
  83.     run_wsgi_app(application)  
  84.   
  85. if __name__ == "__main__":   
  86.     main()  

0 件のコメント:

コメントを投稿

Amazon3