จะลบที่เก็บข้อมูลทั้งหมดใน Google App Engine ได้อย่างไร


122

มีใครรู้วิธีลบที่เก็บข้อมูลทั้งหมดในGoogle App Engineบ้าง


2
db.delete (db.Query (keys_only = true)) รายละเอียดเพิ่มเติมที่นี่stackoverflow.com/a/10856555/290340
Evan Plaice

4
ตามที่ระบุไว้ใน @systempuntoout ด้านล่างตอนนี้ GAE มีผู้ดูแลระบบ Datastoreที่ให้คุณลบเอนทิตีจำนวนมากโดยไม่ต้องเข้ารหัสใด ๆ คุณลักษณะนั้นจะต้องปรากฏที่นี่แทนที่จะฝังอยู่ในความคิดเห็นที่ 3
ralfoide

ผู้ดูแลระบบ Datastore ไม่ทำงาน (หน้านี้โหลด iframe ไปยังโฮสต์ที่ไม่มีอยู่จริง) ดังนั้นเรายังคงต้องใช้เมธอด db.delete

หากต้องการลบข้อมูลทั้งหมดบนเซิร์ฟเวอร์การพัฒนาให้ทำสิ่งต่อไปนี้ในพรอมต์ cmd /path/to/google_appengine/dev_appserver.py --clear_datastore yes myappname/ โดยที่ myappname เป็นไดเร็กทอรีของคุณที่มีไฟล์ app.yaml ของคุณสำหรับแอป .. คุณต้อง cd ไปยังเส้นทางไดเรกทอรีนี้ .. เครดิต: Steven Almeroth และ Melllvar สำหรับคำตอบด้านล่าง
gsinha

คำตอบ:


69

หากคุณกำลังพูดถึงที่เก็บข้อมูลสดให้เปิดแดชบอร์ดสำหรับแอปของคุณ (เข้าสู่ระบบบน appengine) จากนั้นที่เก็บข้อมูล -> dataviewer เลือกแถวทั้งหมดสำหรับตารางที่คุณต้องการลบและกดปุ่มลบ (คุณจะต้อง ทำสิ่งนี้กับทุกโต๊ะของคุณ) คุณสามารถทำแบบเดียวกันทางโปรแกรมผ่าน remote_api (แต่ฉันไม่เคยใช้เลย)

หากคุณกำลังพูดคุยเกี่ยวกับการเก็บข้อมูลการพัฒนาคุณก็จะต้องลบไฟล์ต่อไปนี้: "./WEB-INF/appengine-generated/local_db.bin" ไฟล์จะถูกสร้างให้คุณอีกครั้งในครั้งต่อไปที่คุณเรียกใช้เซิร์ฟเวอร์การพัฒนาและคุณจะมีฐานข้อมูลที่ชัดเจน

อย่าลืมทำความสะอาดโครงการของคุณในภายหลัง

นี่คือหนึ่งใน gotchas เล็ก ๆ น้อย ๆ ที่มีประโยชน์เมื่อคุณเริ่มเล่นกับ Google Application Engine คุณจะพบว่าตัวเองยังคงมีออบเจ็กต์อยู่ในที่เก็บข้อมูลจากนั้นเปลี่ยนโมเดลวัตถุ JDO สำหรับเอนทิตีที่คงอยู่ของคุณซึ่งลงเอยด้วยข้อมูลที่ล้าสมัยซึ่งจะทำให้แอปของคุณพังไปทั่วทุกที่


16
มีพารามิเตอร์ -c ที่ dev_appserver.py จะลบออกจากที่เก็บข้อมูลการพัฒนา
svrist

1
@svrist แต่นั่นใช้ได้กับเอ็นจิ้นแอพ Python เท่านั้น มีใครรู้วิธีทางลัดในการทำใน Java บ้าง? (ในขณะเดียวกันข้อเสนอแนะของ JohnIdol ก็ใช้ได้ผลดี)
mgiuca

2
ขอบคุณ @ จอห์น: เส้นทางที่แน่นอนใน MAC OSX อยู่ที่ไหน
George Nguyen

3
เส้นทางใน Windows อยู่ที่ไหน?
Shane Best

2
@ เชนดีที่สุดเส้นทางใน windows เป็นเช่น ./target/yourappid-1.0-SNAPSHOT/WEB-INF/appengine-generated/local_db.bin
morpheus

58

แนวทางที่ดีที่สุดคือวิธี API ระยะไกลตามที่ Nick แนะนำเขาเป็นวิศวกรApp EngineจากGoogleดังนั้นจงเชื่อใจเขา

ไม่ใช่เรื่องยากที่จะทำและ 1.2.5 SDK ล่าสุดให้ remote_shell_api.py ออกจากชั้นวาง เลยไปดาวน์โหลด SDK ใหม่ จากนั้นทำตามขั้นตอน:

  • เชื่อมต่อเซิร์ฟเวอร์ระยะไกลใน commandline ของคุณ: remote_shell_api.py yourapp /remote_api เชลล์จะถามข้อมูลการเข้าสู่ระบบของคุณและหากได้รับอนุญาตจะสร้าง Python shell ให้คุณ คุณต้องตั้งค่าตัวจัดการ url สำหรับ / remote_api ใน app.yaml ของคุณ

  • ดึงข้อมูลเอนทิตีที่คุณต้องการลบรหัสมีลักษณะดังนี้:

    from models import Entry
    query = Entry.all(keys_only=True)
    entries =query.fetch(1000)
    db.delete(entries)
    \# This could bulk delete 1000 entities a time

ปรับปรุง 2013-10-28 :

  • remote_shell_api.pyได้ถูกแทนที่ด้วยremote_api_shell.pyและคุณควรเชื่อมต่อกับremote_api_shell.py -s your_app_id.appspot.comตามเอกสาร

  • มีฟีเจอร์ทดลองใหม่Datastore Adminหลังจากเปิดใช้งานในการตั้งค่าแอปแล้วคุณสามารถลบจำนวนมากรวมทั้งสำรองที่เก็บข้อมูลของคุณผ่านทางเว็บ ui


17
ที่จริงคุณไม่จำเป็นต้องดึงข้อมูล เพียงแค่ db.delete (Entry.all ()) ก็ทำได้
ดาวน์โหลด

4
คุณต้องทำสิ่งนี้ในชุดเอนทิตี 500 ชุดมิฉะนั้นคุณจะได้รับ: BadRequestError: ไม่สามารถลบมากกว่า 500 เอนทิตีในการโทรครั้งเดียว
marcc

1
เพียงแค่ FYI เพื่อให้คุณใช้ api ระยะไกลคุณต้องเปิดใช้งานในแอปพลิเคชันของคุณก่อนโดยใช้ builtins: - remote_api: ในไฟล์ YAML ของคุณ ข้อมูลเพิ่มเติมอยู่ที่developers.google.com/appengine/articles/remote_api
Zaffiro

2
อย่างน้อยให้เพิ่ม 'keys_only = True' เมื่อคุณเรียก Entry.all () ไม่จำเป็นต้องดึงรายการทั้งหมดหากคุณไม่จำเป็นต้องตรวจสอบข้อมูล มิฉะนั้นคุณกำลังเสียวงจรคอมพิวเตอร์
Evan Plaice

1
+1 ... แต่: ในปี 2013 ไม่มี remote_shell_api.py ชื่อสคริปต์ปัจจุบันคือ remote_api_shell.py นอกจากนี้หากคุณใช้ ndb (ซึ่งเป็นสิ่งที่คนส่วนใหญ่ทำในปัจจุบัน) แนะนำวิธีใช้ ndb.delete_multi (model.Entry.query (). fetch (keys_only = True))
Uri

27

วิธีที่รวดเร็วและมีประสิทธิภาพในการจัดการการลบจำนวนมากบน Datastore คือการใช้mapper APIใหม่ที่ประกาศในGoogle I / Oล่าสุด

หากภาษาที่คุณเลือกคือPythonคุณต้องลงทะเบียน mapper ของคุณในไฟล์mapreduce.yamlและกำหนดฟังก์ชันดังนี้:

from mapreduce import operation as op
def process(entity):
 yield op.db.Delete(entity)

บนJavaคุณควรดูบทความนี้ที่แนะนำฟังก์ชันดังนี้:

@Override
public void map(Key key, Entity value, Context context) {
    log.info("Adding key to deletion pool: " + key);
    DatastoreMutationPool mutationPool = this.getAppEngineContext(context)
            .getMutationPool();
    mutationPool.delete(value.getKey());
}

แก้ไข:
เนื่องจาก SDK 1.3.8 มีคุณลักษณะผู้ดูแลระบบ Datastoreสำหรับจุดประสงค์นี้


27

คุณสามารถล้างที่เก็บข้อมูลเซิร์ฟเวอร์การพัฒนาเมื่อคุณเรียกใช้เซิร์ฟเวอร์:

/path/to/dev_appserver.py --clear_datastore=yes myapp

คุณยังสามารถย่อ--clear_datastoreด้วย-c.


5
ไม่แน่ใจว่าเป็นเรื่องล่าสุดหรือไม่ แต่ตอนนี้ไวยากรณ์จริง/path/to/google_appengine/dev_appserver.py --clear_datastore yes myappname/(สังเกตว่า 'ใช่')
Melllvar

เป็นวิธีที่มีประโยชน์ที่สุดในการลบที่เก็บข้อมูลซ้ำ ๆ ระหว่างการพัฒนา ด้วยตัวเลือกที่ล้าสมัยอย่างรวดเร็วจึงควรเน้นว่าธงนี้ยังคงมีอยู่ในเดือนกรกฎาคม 2018 และใช้ได้กับ dev_appserver ที่ติดตั้งผ่าน gcloud CLI
Michael

ในเวอร์ชัน 270.0.0 ของ Google Cloud SDK "--clear_datastore = yes" ยังคงใช้งานได้กับเครื่องหมายเท่ากับ
franksands

15

หากคุณมีข้อมูลจำนวนมากคุณต้องใช้สคริปต์เพื่อลบข้อมูลนั้น คุณสามารถใช้ remote_api เพื่อล้างที่เก็บข้อมูลจากฝั่งไคลเอ็นต์ได้อย่างตรงไปตรงมา


11

ได้ที่นี่: ไปที่ Datastore Admin จากนั้นเลือกประเภทเอนทิตีที่คุณต้องการลบแล้วคลิกลบ Mapreduce จะจัดการลบ!


9

มีหลายวิธีที่คุณสามารถใช้เพื่อลบรายการออกจาก Datastore ของ App Engine:

ใส่คำอธิบายภาพที่นี่

  1. ขั้นแรกให้คิดว่าคุณจำเป็นต้องลบรายการหรือไม่ ราคาแพงและอาจถูกกว่าหากไม่นำออก

  2. คุณสามารถลบรายการทั้งหมดด้วยตนเองโดยใช้ Datastore Admin

  3. คุณสามารถใช้ Remote API และลบรายการแบบโต้ตอบได้

  4. คุณสามารถลบรายการออกทางโปรแกรมโดยใช้โค้ดสองสามบรรทัด

  5. คุณสามารถลบออกเป็นกลุ่มได้โดยใช้คิวงานและเคอร์เซอร์

  6. หรือคุณสามารถใช้ Mapreduce เพื่อรับสิ่งที่แข็งแกร่งและน่าสนใจยิ่งขึ้น

แต่ละวิธีเหล่านี้อธิบายไว้ในบล็อกโพสต์ต่อไปนี้: http://www.shiftedup.com/2015/03/28/how-to-bulk-delete-entries-in-app-engine-datastore

หวังว่าจะช่วยได้!


6

วิธีตั้งค่าเป็นศูนย์ในการดำเนินการนี้คือการส่งคำขอ HTTP ที่ดำเนินการโดยพลการรหัสไปยังบริการผู้ดูแลระบบที่แอปที่ทำงานอยู่แล้วโดยอัตโนมัติมี:

import urllib
import urllib2

urllib2.urlopen('http://localhost:8080/_ah/admin/interactive/execute',
    data = urllib.urlencode({'code' : 'from google.appengine.ext import db\n' +
                                      'db.delete(db.Query())'}))

สิ่งนี้ใช้ได้กับเซิร์ฟเวอร์การพัฒนาเท่านั้น มีการผลิตเทียบเท่าหรือไม่?
Gady

3

แหล่ง

ฉันได้รับสิ่งนี้จาก http://code.google.com/appengine/articles/remote_api.html

สร้าง Interactive Console

ขั้นแรกคุณต้องกำหนดคอนโซล appenginge แบบโต้ตอบ สร้างไฟล์ชื่อ 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())



สร้างคลาสพื้นฐานของ Mapper

เมื่อเข้าที่แล้วให้สร้างคลาส Mapper นี้ ฉันเพิ่งสร้างไฟล์ใหม่ชื่อ 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)

Mapper ควรเป็นเพียงคลาสนามธรรมที่ช่วยให้คุณสามารถทำซ้ำได้ทุกเอนทิตีในประเภทที่กำหนดไม่ว่าจะเป็นการดึงข้อมูลหรือแก้ไขและจัดเก็บเอนทิตีที่อัปเดตกลับไปยังที่เก็บข้อมูล

วิ่งด้วย!

ตอนนี้เริ่มคอนโซลแบบโต้ตอบ appengine ของคุณ:

$python appengine_console.py <app_id_here>

นั่นควรเริ่มคอนโซลแบบโต้ตอบ ในนั้นสร้างคลาสย่อยของ Model:

from utils import Mapper
# import your model class here 
class MyModelDeleter(Mapper):
    KIND = <model_name_here>

    def map(self, entity):
        return ([], [entity])

และสุดท้ายเรียกใช้ (จากคอนโซลแบบโต้ตอบของคุณ): mapper = MyModelDeleter () mapper.run ()

แค่นั้นแหละ!


3

คุณสามารถทำได้โดยใช้เว็บอินเตอร์เฟส ลงชื่อเข้าใช้บัญชีของคุณนำทางด้วยลิงก์ทางด้านซ้ายมือ ในการจัดการที่เก็บข้อมูลคุณมีตัวเลือกในการแก้ไขและลบข้อมูล ใช้ตัวเลือกที่เกี่ยวข้อง


3

ฉันได้สร้างแผงส่วนเสริมที่สามารถใช้กับแอป App Engine ที่ทำให้ใช้งานได้ โดยจะแสดงรายการประเภทที่มีอยู่ในที่เก็บข้อมูลในเมนูแบบเลื่อนลงและคุณสามารถคลิกปุ่มเพื่อกำหนดเวลา "งาน" ที่จะลบเอนทิตีทั้งหมดในประเภทที่เฉพาะเจาะจงหรือทุกอย่าง คุณสามารถดาวน์โหลดได้ที่นี่:
http://code.google.com/p/jobfeed/wiki/Nuke


3

สำหรับ Python 1.3.8 มีผู้ดูแลระบบทดลองในตัวสำหรับสิ่งนี้ พวกเขากล่าวว่า : "เปิดใช้งาน builtin ต่อไปนี้ในไฟล์ app.yaml ของคุณ:"

builtins:
- datastore_admin: on

"ขณะนี้การลบ Datastore สามารถใช้ได้กับรันไทม์ Python เท่านั้นอย่างไรก็ตามแอปพลิเคชัน Java ยังคงสามารถใช้ประโยชน์จากคุณลักษณะนี้ได้โดยการสร้างเวอร์ชันแอปพลิเคชัน Python ที่ไม่ใช่ค่าเริ่มต้นที่เปิดใช้งาน Datastore Admin ใน app.yaml การสนับสนุนดั้งเดิมสำหรับ Java จะรวมอยู่ด้วย ในการเปิดตัวที่กำลังจะมีขึ้น "


การเพิ่มการกำหนดค่าใน app.yaml ทำให้เกิดข้อผิดพลาด แต่เราสามารถเปิดใช้งานได้จากหน้า "การตั้งค่าแอปพลิเคชัน" ในส่วน "การดูแลระบบ" จะมีปุ่มเพื่อเปิดใช้งานมัน
Sundeep

3

เปิด "Datastore Admin" สำหรับแอปพลิเคชันของคุณและเปิดใช้งาน Admin จากนั้นเอนทิตีทั้งหมดของคุณจะแสดงรายการพร้อมช่องทำเครื่องหมาย คุณสามารถเลือกรายการที่ไม่ต้องการและลบออกได้


3

นี่คือสิ่งที่คุณกำลังมองหา ...

db.delete(Entry.all(keys_only=True))

การเรียกใช้การสืบค้นแบบใช้คีย์อย่างเดียวนั้นเร็วกว่าการดึงข้อมูลแบบเต็มมากและโควต้าของคุณจะได้รับผลกระทบน้อยกว่าเนื่องจากการสืบค้นแบบใช้คีย์เท่านั้นถือเป็นการดำเนินการเพียงเล็กน้อย

นี่คือลิงค์ไปยังคำตอบจาก Nick Johnson ที่อธิบายเพิ่มเติม

ด้านล่างนี้คือโซลูชัน REST API แบบ end-to-end ในการตัดทอนตาราง ...

ฉันตั้งค่า REST API เพื่อจัดการธุรกรรมฐานข้อมูลที่มีการแมปเส้นทางโดยตรงไปยังโมเดล / การดำเนินการที่เหมาะสม สามารถเรียกได้โดยป้อน url ที่ถูกต้อง (example.com/inventory/truncate) และเข้าสู่ระบบ

นี่คือเส้นทาง:

Route('/inventory/truncate', DataHandler, defaults={'_model':'Inventory', '_action':'truncate'})

นี่คือตัวจัดการ:

class DataHandler(webapp2.RequestHandler):
  @basic_auth
  def delete(self, **defaults):
    model = defaults.get('_model')
    action = defaults.get('_action')
    module = __import__('api.models', fromlist=[model])
    model_instance = getattr(module, model)()
    result = getattr(model_instance, action)()

เริ่มต้นด้วยการโหลดโมเดลแบบไดนามิก (เช่นสินค้าคงคลังที่พบภายใต้ api.models) จากนั้นเรียกเมธอดที่ถูกต้อง (Inventory.truncate ()) ตามที่ระบุในพารามิเตอร์การดำเนินการ

@basic_auth เป็นมัณฑนากร / wrapper ที่ให้การพิสูจน์ตัวตนสำหรับการดำเนินการที่ละเอียดอ่อน (เช่น POST / DELETE) นอกจากนี้ยังมีมัณฑนากร oAuthหากคุณกังวลเกี่ยวกับความปลอดภัย

ในที่สุดการกระทำนี้เรียกว่า:

def truncate(self):
  db.delete(Inventory.all(keys_only=True))

ดูเหมือนเวทมนตร์ แต่จริงๆแล้วมันตรงไปตรงมามาก ส่วนที่ดีที่สุดคือสามารถใช้ delete () ซ้ำเพื่อจัดการการลบผลลัพธ์หนึ่งหรือหลายรายการโดยเพิ่มการดำเนินการอื่นในโมเดล


3

คุณสามารถลบ Datastore ทั้งหมดได้โดยการลบทุกชนิดทีละรายการ ด้วย google appengine dash board โปรดทำตามขั้นตอนเหล่านี้

  1. เข้าสู่ระบบhttps://console.cloud.google.com/datastore/settings
  2. คลิกเปิด Datastore ธุรการ (เปิดใช้งานหากไม่ได้เปิดใช้งาน)
  3. เลือกเอนทิตีทั้งหมดแล้วกดลบ (ขั้นตอนนี้เรียกใช้งานลดแผนที่สำหรับการลบชนิดที่เลือกทั้งหมด)

สำหรับข้อมูลเพิ่มเติมโปรดดูภาพนี้http://storage.googleapis.com/bnifsc/Sc screenshot%20from%202015-01-31%2023%3A58%3A41.png


2

หากคุณมีข้อมูลจำนวนมากการใช้เว็บอินเทอร์เฟซอาจใช้เวลานาน เปิด App Engineยูทิลิตี้ช่วยให้คุณทุกอย่างลบในหนึ่งไปกับ 'ล้างเก็บข้อมูลเกี่ยวกับการเปิดช่องทำเครื่องหมาย ขณะนี้ยูทิลิตี้นี้พร้อมใช้งานสำหรับทั้ง Windows และ Mac (เฟรมเวิร์ก Python)


2

สำหรับเซิร์ฟเวอร์การพัฒนาแทนที่จะเรียกใช้เซิร์ฟเวอร์ผ่านตัวเรียกใช้งานแอป google app คุณสามารถเรียกใช้จากเทอร์มินัลเช่น:

dev_appserver.py --port = [portnumber] --clear_datastore = ใช่ [nameofapplication]

เช่นแอปพลิเคชันของฉัน "reader" ทำงานบนพอร์ต 15080 หลังจากแก้ไขโค้ดและรีสตาร์ทเซิร์ฟเวอร์ฉันก็เรียกใช้ "dev_appserver.py --port = 15080 --clear_datastore = yes reader"

มันดีสำหรับฉัน


2

การเพิ่มคำตอบเกี่ยวกับการพัฒนาล่าสุด

Google เพิ่งเพิ่มคุณลักษณะผู้ดูแลระบบที่เก็บข้อมูล คุณสามารถสำรองลบหรือคัดลอกเอนทิตีของคุณไปยังแอพอื่นโดยใช้คอนโซลนี้

https://developers.google.com/appengine/docs/adminconsole/datastoreadmin#Deleting_Entities_in_Bulk


1

ฉันมักไม่ต้องการลบที่เก็บข้อมูลทั้งหมดดังนั้นฉันจึงดึงสำเนา /war/WEB-INF/local_db.bin ออกจากการควบคุมแหล่งที่มา มันอาจจะเป็นฉัน แต่ดูเหมือนว่าแม้โหมด Dev จะหยุดลงฉันก็ต้องลบไฟล์ออกก่อนที่จะดึงออก สิ่งนี้อยู่บน Windows โดยใช้ปลั๊กอินการโค่นล้มสำหรับ Eclipse


0

รูปแบบ PHP:

import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.DatastoreServiceFactory;

define('DATASTORE_SERVICE', DatastoreServiceFactory::getDatastoreService());

function get_all($kind) {
    $query = new Query($kind);
    $prepared = DATASTORE_SERVICE->prepare($query);
    return $prepared->asIterable();
}

function delete_all($kind, $amount = 0) {
    if ($entities = get_all($kind)) {
        $r = $t = 0;
        $delete = array();
        foreach ($entities as $entity) {
            if ($r < 500) {
                $delete[] = $entity->getKey();
            } else {
                DATASTORE_SERVICE->delete($delete);
                $delete = array();
                $r = -1;
            }
            $r++; $t++;
            if ($amount && $amount < $t) break;
        }
        if ($delete) {
            DATASTORE_SERVICE->delete($delete);
        }
    }
}

ใช่จะใช้เวลาและ 30 วินาที เป็นขีด จำกัด ฉันคิดว่าจะใส่ตัวอย่างแอป ajax ให้ทำงานอัตโนมัติเกิน 30 วินาที


นี่ไม่ใช่ php ที่ถูกต้อง import? การกำหนดค่าคงที่เป็นอินสแตนซ์ของวัตถุ?
Josh J

0
for amodel in db.Model.__subclasses__():
                dela=[]
                print amodel
                try:
                    m = amodel()
                    mq = m.all()
                    print mq.count()
                    for mw in mq:
                        dela.append(mw)
                    db.delete(dela)
            #~ print len(dela)

                except:
                    pass

0

หากคุณใช้ ndb วิธีที่ใช้ได้ผลสำหรับฉันในการล้างที่เก็บข้อมูล:

ndb.delete_multi(ndb.Query(default_options=ndb.QueryOptions(keys_only=True)))

1
ฉันไม่คิดว่าจะได้ผล Appengine บ่นเกี่ยวกับSorry, unexpected error: The kind "__Stat_Kind__" is reserved.สิ่งนี้ดูเหมือนว่า appengine มีเอนทิตีสถิติภายในบางอย่างที่สามารถเปิดเผยได้ด้วยวิธีนี้ (ข้อผิดพลาดที่เป็นไปได้ในตอนท้าย?)
หายไป

0

สำหรับพื้นที่เก็บข้อมูลใด ๆ ที่อยู่ใน App Engine แทนที่จะใช้ในพื้นที่คุณสามารถใช้Datastore API ใหม่ได้ นี่คือไพรเมอร์สำหรับวิธีการเริ่มต้น

ฉันเขียนสคริปต์ที่ลบเอนทิตีที่ไม่ใช่ในตัวทั้งหมด API มีการเปลี่ยนแปลงค่อนข้างรวดเร็วดังนั้นสำหรับการอ้างอิงฉันโคลนมันที่กระทำ990ab5c7f2063e8147bcc56ee222836fd3d6e15b

from gcloud import datastore
from gcloud.datastore import SCOPE
from gcloud.datastore.connection import Connection
from gcloud.datastore import query

from oauth2client import client

def get_connection():
  client_email = 'XXXXXXXX@developer.gserviceaccount.com'
  private_key_string = open('/path/to/yourfile.p12', 'rb').read()

  svc_account_credentials = client.SignedJwtAssertionCredentials(
    service_account_name=client_email,
    private_key=private_key_string,
    scope=SCOPE)

  return Connection(credentials=svc_account_credentials)


def connect_to_dataset(dataset_id):
  connection = get_connection()
  datastore.set_default_connection(connection)
  datastore.set_default_dataset_id(dataset_id)

if __name__ == "__main__":
  connect_to_dataset(DATASET_NAME)
  gae_entity_query = query.Query()
  gae_entity_query.keys_only()
  for entity in gae_entity_query.fetch():
    if entity.kind[0] != '_':
      print entity.kind
      entity.key.delete()

0
  • การดำเนินแนวคิดของ svpino ต่อไปเป็นภูมิปัญญาในการนำบันทึกที่ทำเครื่องหมายว่าลบมาใช้ซ้ำ (แนวคิดของเขาไม่ได้ต้องการลบ แต่ทำเครื่องหมายว่า "ลบ" บันทึกที่ไม่ได้ใช้) แคช / memcache เล็กน้อยเพื่อจัดการกับสำเนาที่ใช้งานได้และเขียนเฉพาะความแตกต่างของสถานะ (ก่อนและหลังงานที่ต้องการ) ไปยังที่เก็บข้อมูลจะทำให้ดีขึ้น สำหรับงานใหญ่คุณสามารถเขียนส่วนที่แตกต่างระดับกลางไปยังที่เก็บข้อมูลเพื่อหลีกเลี่ยงการสูญหายของข้อมูลหาก memcache หายไป เพื่อป้องกันการสูญเสียคุณสามารถตรวจสอบความสมบูรณ์ / การมีอยู่ของผลลัพธ์ memcached และเริ่มงานใหม่ (หรือส่วนที่จำเป็น) เพื่อทำซ้ำการคำนวณที่ขาดหายไป เมื่อเขียนความแตกต่างของข้อมูลไปยังพื้นที่เก็บข้อมูลการคำนวณที่จำเป็นจะถูกละทิ้งในคิว

  • ความคิดอื่น ๆ ที่คล้ายกับแผนที่ลดลงคือการแบ่งประเภทเอนทิตีไปยังเอนทิตีชนิดต่างๆดังนั้นมันจะถูกรวบรวมเข้าด้วยกันและมองเห็นเป็นชนิดเอนทิตีเดียวสำหรับผู้ใช้ขั้นสุดท้าย รายการจะถูกทำเครื่องหมายว่า "ลบ" เท่านั้น เมื่อ "ลบ" จำนวนรายการต่อชาร์ดเกินขีด จำกัด บางส่วนรายการ "มีชีวิต" จะถูกกระจายระหว่างส่วนอื่น ๆ และชาร์ดนี้จะถูกปิดตลอดไปจากนั้นจึงลบออกด้วยตนเองจากคอนโซลผู้พัฒนา (เดาว่าเสียค่าใช้จ่ายน้อยกว่า) การอัปเดต: ดูเหมือนว่าไม่มีตารางดร็อปที่คอนโซล ลบระเบียนต่อระเบียนในราคาปกติเท่านั้น

  • เป็นไปได้ที่จะลบโดยการค้นหาโดยกลุ่มของระเบียนจำนวนมากโดยที่ gae ไม่ล้มเหลว (อย่างน้อยก็ใช้งานได้ในเครื่อง) โดยมีความเป็นไปได้ที่จะดำเนินการต่อในครั้งต่อไปเมื่อหมดเวลา:


    qdelete.getFetchPlan().setFetchSize(100);

    while (true)
    {
        long result = qdelete.deletePersistentAll(candidates);
        LOG.log(Level.INFO, String.format("deleted: %d", result));
        if (result <= 0)
            break;
    }
  • บางครั้งก็มีประโยชน์ในการสร้างฟิลด์เพิ่มเติมในตารางหลักแทนที่จะใส่ผู้สมัคร (บันทึกที่เกี่ยวข้อง) ลงในตารางแยกต่างหาก และใช่ฟิลด์อาจเป็นอาร์เรย์ที่ไม่ได้จัดทำดัชนี / อนุกรมโดยมีต้นทุนการคำนวณเพียงเล็กน้อย

0

สำหรับทุกคนที่ต้องการโซลูชันที่รวดเร็วสำหรับเซิร์ฟเวอร์ dev (ขณะที่เขียนในเดือนกุมภาพันธ์ 2016):

  1. หยุดเซิร์ฟเวอร์ dev
  2. ลบไดเร็กทอรีเป้าหมาย
  3. สร้างโครงการใหม่

การดำเนินการนี้จะล้างข้อมูลทั้งหมดจากที่เก็บข้อมูล


0

ฉันรู้สึกหงุดหงิดมากเกี่ยวกับโซลูชันที่มีอยู่สำหรับการลบข้อมูลทั้งหมดในที่เก็บข้อมูลสดซึ่งฉันได้สร้างแอป GAE ขนาดเล็กที่สามารถลบข้อมูลจำนวนหนึ่งได้ภายใน 30 วินาที

วิธีการติดตั้ง ฯลฯ : https://github.com/xamde/xydra


0

สำหรับ java

DatastoreService db = DatastoreServiceFactory.getDatastoreService();
List<Key> keys = new ArrayList<Key>();
for(Entity e : db.prepare(new Query().setKeysOnly()).asIterable())
    keys.add(e.getKey());
db.delete(keys);

ทำงานได้ดีในเซิร์ฟเวอร์การพัฒนา


0

คุณมี 2 วิธีง่ายๆ

# 1: เพื่อประหยัดค่าใช้จ่ายให้ลบโครงการทั้งหมด

# 2: การใช้ ts-datastore-orm:

https://www.npmjs.com/package/ts-datastore-orm รอ Entity.truncate (); การตัดทอนสามารถลบได้ประมาณ 1K แถวต่อวินาที

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.