Làm cách nào để xóa tất cả kho dữ liệu trong Google App Engine?


122

Có ai biết cách xóa tất cả kho dữ liệu trong Google App Engine không?


2
db.delete (db.Query (key_only = True)). Chi tiết thêm tại đây stackoverflow.com/a/10856555/290340 .
Evan Plaice

4
Như được chỉ ra bởi @systempuntoout bên dưới, GAE hiện có Quản trị kho dữ liệu cho phép bạn xóa hàng loạt thực thể mà không cần mã hóa, trong số những thứ khác. Tính năng đó cần được hiển thị ở đây thay vì bị chôn vùi trong bình luận thứ 3.
ralfoide 14/12/12

Quản trị kho dữ liệu không hoạt động (trang tải iframe đến một máy chủ không tồn tại), vì vậy chúng tôi vẫn cần sử dụng phương thức db.delete.

Để xóa tất cả dữ liệu trên máy chủ phát triển, hãy đưa ra lời nhắc sau trên cmd: /path/to/google_appengine/dev_appserver.py --clear_datastore yes myappname/ trong đó myappname là thư mục chứa tệp app.yaml của bạn cho ứng dụng .. bạn cần phải cd đến đường dẫn thư mục này .. tín dụng: Steven Almeroth và Melllvar để có câu trả lời bên dưới
gsinha

Câu trả lời:


69

Nếu bạn đang nói về kho dữ liệu trực tiếp , hãy mở trang tổng quan cho ứng dụng của bạn (đăng nhập trên appengine) rồi đến kho dữ liệu -> trình xem dữ liệu, chọn tất cả các hàng cho bảng bạn muốn xóa và nhấn nút xóa (bạn sẽ phải làm điều này cho tất cả các bảng của bạn). Bạn có thể làm điều tương tự theo chương trình thông qua remote_api (nhưng tôi chưa bao giờ sử dụng nó).

Nếu bạn đang nói về kho dữ liệu phát triển , bạn chỉ cần xóa tệp sau: "./WEB-INF/appengine-generated/local_db.bin" . Tệp sẽ được tạo lại cho bạn vào lần sau khi bạn chạy máy chủ phát triển và bạn sẽ có một db rõ ràng.

Đảm bảo làm sạch dự án của bạn sau đó.

Đây là một trong những mẹo nhỏ hữu ích khi bạn bắt đầu chơi với Google Application Engine. Bạn sẽ thấy mình đang tồn tại các đối tượng vào kho dữ liệu, sau đó thay đổi mô hình đối tượng JDO cho các thực thể bền bỉ của bạn, kết thúc với dữ liệu lỗi thời sẽ khiến ứng dụng của bạn bị lỗi khắp nơi.


16
Có một tham số -c đối với dev_appserver.py để xóa khỏi kho dữ liệu phát triển.
svrist 11/09/09

1
@svrist Nhưng điều đó chỉ áp dụng cho công cụ ứng dụng Python. Có ai biết làm thế nào một phím tắt để làm điều đó trong Java không? (Trong khi chờ đợi, đề xuất của JohnIdol hoạt động tốt.)
mgiuca

2
Cảm ơn @John: Đường dẫn chính xác trong MAC OSX ở đâu?
George Nguyen

3
Đường dẫn trong Windows ở đâu?
Shane Tốt nhất

2
@ShaneBest đường dẫn trong windows giống như ./target/yourappid-1.0-SNAPSHOT/WEB-INF/appengine-generated/local_db.bin
morpheus

58

Cách tiếp cận tốt nhất là phương pháp API từ xa theo đề xuất của Nick, anh ấy là kỹ sư App Engine của Google , vì vậy hãy tin tưởng anh ấy.

Việc này không khó thực hiện và SDK 1.2.5 mới nhất cung cấp remote_shell_api.py ra khỏi giá. Vì vậy, hãy tải xuống SDK mới. Sau đó làm theo các bước:

  • kết nối máy chủ từ xa trong dòng lệnh của bạn: remote_shell_api.py yourapp /remote_api Trình bao sẽ yêu cầu thông tin đăng nhập của bạn và nếu được phép, sẽ tạo một trình bao Python cho bạn. Bạn cần thiết lập trình xử lý url cho / remote_api trong app.yaml của mình

  • tìm nạp các thực thể bạn muốn xóa, mã trông giống như sau:

    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

Cập nhật 2013-10-28 :

  • remote_shell_api.pyđã được thay thế bằng remote_api_shell.py, và bạn nên kết nối với remote_api_shell.py -s your_app_id.appspot.com, theo tài liệu .

  • Có một tính năng thử nghiệm mới Quản trị kho dữ liệu, sau khi bật nó trong cài đặt ứng dụng, bạn có thể xóa hàng loạt cũng như sao lưu kho dữ liệu của mình thông qua ui web.


17
Trên thực tế, bạn không cần tìm nạp. Chỉ cần db.delete (Entry.all ()) sẽ làm điều đó.
tải xuống

4
Bạn cần phải làm điều này trong 500 bộ tổ chức hoặc nếu không bạn sẽ nhận được: BadRequestError: không thể xóa hơn 500 đơn vị trong một cuộc gọi duy nhất
marcc

1
Chỉ là FYI, để bạn sử dụng api từ xa, trước tiên bạn cần kích hoạt nó trong ứng dụng của mình bằng cách sử dụng nội trang: - remote_api: trong tệp YAML của bạn. biết thêm là tại developers.google.com/appengine/articles/remote_api
Zaffiro

2
Ít nhất hãy thêm 'key_only = True' khi bạn gọi Entry.all (). Không cần tìm nạp toàn bộ mục nhập nếu bạn không cần kiểm tra dữ liệu. Nếu không, bạn chỉ đang lãng phí các chu kỳ tính toán.
Evan Plaice

1
+1 ... nhưng: Kể từ năm 2013, remote_shell_api.py không tồn tại. Tên tập lệnh hiện tại là remote_api_shell.py. Ngoài ra, nếu bạn sử dụng NDB (đó là những gì hầu hết mọi người làm những ngày này), cách khuyến khích để sử dụng ndb.delete_multi (. Model.Entry.query () lấy (keys_only = True))
Uri

27

Cách nhanh nhất và hiệu quả để xử lý xóa hàng loạt trên Kho dữ liệu là sử dụng API trình ánh xạ mới được công bố trên Google I / O mới nhất .

Nếu ngôn ngữ bạn chọn là Python , bạn chỉ cần đăng ký trình ánh xạ của mình trong tệp mapreduce.yaml và xác định một hàm như sau:

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

Trên Java, bạn nên xem bài viết này đề xuất một hàm như thế này:

@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());
}

CHỈNH SỬA:
Kể từ SDK 1.3.8, có một tính năng quản trị Kho dữ liệu cho mục đích này


27

Bạn có thể xóa kho dữ liệu của máy chủ phát triển khi bạn chạy máy chủ:

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

Bạn cũng có thể viết tắt --clear_datastorevới -c.


5
Không chắc chắn nếu đó là một điều gần đây, nhưng các cú pháp thực tế hiện nay là /path/to/google_appengine/dev_appserver.py --clear_datastore yes myappname/(lưu ý các 'yes')
Melllvar

Đây là cách hữu ích nhất để xóa liên tục kho dữ liệu trong quá trình phát triển. Với tùy chọn nhận được nhanh chóng trở nên lỗi thời, nó có giá trị để làm nổi bật cờ này vẫn được đặt ra trong tháng 7 năm 2018, và các công trình cho dev_appserver cài đặt qua gcloud CLI
Michael

Trong phiên bản 270.0.0 của Google Cloud SDK "--clear_datastore = yes" vẫn hoạt động với dấu bằng
franksands

15

Nếu bạn có một lượng lớn dữ liệu, bạn cần sử dụng tập lệnh để xóa nó. Tuy nhiên, bạn có thể sử dụng remote_api để xóa kho dữ liệu từ phía máy khách một cách đơn giản.


11

Đây là kết quả của bạn: Đi tới Quản trị kho dữ liệu, sau đó chọn loại Thực thể bạn muốn xóa và nhấp vào Xóa. Mapreduce sẽ lo việc xóa!


9

Có một số cách bạn có thể sử dụng để xóa các mục nhập khỏi Kho dữ liệu của App Engine:

nhập mô tả hình ảnh ở đây

  1. Đầu tiên, hãy nghĩ xem bạn có thực sự cần xóa các mục nhập không. Điều này là tốn kém và có thể rẻ hơn nếu không loại bỏ chúng.

  2. Bạn có thể xóa tất cả các mục nhập bằng tay bằng cách sử dụng Quản trị kho dữ liệu.

  3. Bạn có thể sử dụng API từ xa và xóa các mục nhập một cách tương tác.

  4. Bạn có thể xóa các mục nhập theo chương trình bằng một vài dòng mã.

  5. Bạn có thể loại bỏ chúng hàng loạt bằng cách sử dụng Hàng đợi Tác vụ và Con trỏ.

  6. Hoặc bạn có thể sử dụng Mapreduce để có được thứ gì đó mạnh mẽ hơn và đẹp hơn.

Mỗi một trong những phương pháp này được giải thích trong bài đăng blog sau: http://www.shiftedup.com/2015/03/28/how-to-bulk-delete-entries-in-app-engine-datastore

Hy vọng nó giúp!


6

Cách không thiết lập để thực hiện việc này là gửi một yêu cầu HTTP mã thực thi tùy ý đến dịch vụ quản trị mà ứng dụng đang chạy của bạn đã tự động có:

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())'}))

Điều này chỉ hoạt động cho máy chủ phát triển. Có sản xuất tương đương không?
Gady

3

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ó!


3

Bạn có thể làm điều đó bằng cách sử dụng giao diện web. Đăng nhập vào tài khoản của bạn, điều hướng bằng các liên kết ở phía bên tay trái. Trong quản lý Cửa hàng dữ liệu, bạn có các tùy chọn để sửa đổi và xóa dữ liệu. Sử dụng các tùy chọn tương ứng.


3

Tôi đã tạo một bảng bổ trợ có thể được sử dụng với các ứng dụng App Engine đã triển khai của bạn. Nó liệt kê các loại có trong kho dữ liệu trong danh sách thả xuống và bạn có thể nhấp vào nút để lập lịch "nhiệm vụ" xóa tất cả các thực thể của một loại cụ thể hoặc đơn giản là mọi thứ. Bạn có thể tải xuống tại đây:
http://code.google.com/p/jobfeed/wiki/Nuke


3

Đối với Python, 1.3.8 bao gồm một quản trị viên thử nghiệm được tích hợp sẵn cho việc này. Họ nói : "bật nội trang sau trong tệp app.yaml của bạn:"

builtins:
- datastore_admin: on

"Xóa kho dữ liệu hiện chỉ khả dụng với thời gian chạy Python. Tuy nhiên, các ứng dụng Java vẫn có thể tận dụng tính năng này bằng cách tạo phiên bản ứng dụng Python không phải mặc định cho phép Quản trị kho dữ liệu trong app.yaml. Hỗ trợ gốc cho Java sẽ được bao gồm trong một bản phát hành sắp tới. "


Việc thêm cấu hình trong app.yaml đã gây ra lỗi. Thay vào đó, chúng ta có thể bật nó từ Trang 'Cài đặt Ứng dụng' trong phần 'Quản trị'. Có một nút để kích hoạt nó
Sundeep

3

Mở "Quản trị kho dữ liệu" cho ứng dụng của bạn và bật Quản trị viên. Sau đó, tất cả các thực thể của bạn sẽ được liệt kê bằng các hộp kiểm. Bạn chỉ cần chọn những thứ không mong muốn và xóa chúng.


3

Đây là những gì bạn đang tìm kiếm ...

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

Chạy truy vấn chỉ khóa nhanh hơn nhiều so với tìm nạp đầy đủ và hạn ngạch của bạn sẽ mất ít thời gian hơn vì các truy vấn chỉ có khóa được coi là hoạt động nhỏ.

Đây là liên kết đến câu trả lời từ Nick Johnson, mô tả thêm về nó.

Dưới đây là giải pháp API REST end-to-end để cắt bớt một bảng ...

Tôi thiết lập một API REST để xử lý các giao dịch cơ sở dữ liệu trong đó các tuyến đường được ánh xạ trực tiếp đến mô hình / hành động thích hợp. Điều này có thể được gọi bằng cách nhập url bên phải (example.com/inventory/truncate) và đăng nhập.

Đây là tuyến đường:

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

Đây là trình xử lý:

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)()

Nó bắt đầu bằng cách tải động mô hình (tức là Khoảng không quảng cáo được tìm thấy trong api.models), sau đó gọi phương thức chính xác (Inventory.truncate ()) như được chỉ định trong tham số hành động.

@Basic_auth là trình trang trí / trình bao bọc cung cấp xác thực cho các hoạt động nhạy cảm (tức là POST / DELETE). Ngoài ra còn có trình trang trí oAuth nếu bạn lo lắng về bảo mật.

Cuối cùng, hành động được gọi là:

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

Nó trông giống như ma thuật nhưng nó thực sự rất đơn giản. Phần tốt nhất là, delete () có thể được sử dụng lại để xử lý việc xóa một hoặc nhiều kết quả bằng cách thêm một hành động khác vào mô hình.


3

Bạn có thể xóa tất cả kho dữ liệu bằng cách xóa tất cả từng loại một. với bảng điều khiển ứng dụng google. Vui lòng làm theo các bước sau.

  1. Đăng nhập vào https://console.cloud.google.com/datastore/settings
  2. Nhấp vào Mở quản trị kho dữ liệu . (Bật nó nếu chưa được bật.)
  3. Chọn tất cả Thực thể và nhấn xóa. (Bước này chạy công việc giảm bản đồ để xóa tất cả các Loại đã chọn.)

để biết thêm thông tin, hãy xem Hình ảnh này http://storage.googleapis.com/bnifsc/Screenshot%20from%202015-01-31%2023%3A58%3A41.png


2

Nếu bạn có nhiều dữ liệu, việc sử dụng giao diện web có thể tốn thời gian. Các App Engine Launcher tiện ích cho phép bạn tất cả mọi thứ xóa trong một đi với 'Clear kho dữ liệu về ra mắt' hộp kiểm. Tiện ích này hiện có sẵn cho cả Windows và Mac (Python framework).


2

Đối với máy chủ phát triển, thay vì chạy máy chủ thông qua trình khởi chạy công cụ ứng dụng google, bạn có thể chạy nó từ thiết bị đầu cuối như:

dev_appserver.py --port = [portnumber] --clear_datastore = yes [nameofapplication]

ví dụ: "trình đọc" ứng dụng của tôi chạy trên cổng 15080. Sau khi sửa đổi mã và khởi động lại máy chủ, tôi chỉ chạy "dev_appserver.py --port = 15080 --clear_datastore = yes reader".

Nó tốt cho tôi.



1

Tôi thường không muốn xóa tất cả kho lưu trữ dữ liệu vì vậy tôi kéo một bản sao sạch của /war/WEB-INF/local_db.bin ra ngoài kiểm soát nguồn. Có thể chỉ là tôi nhưng có vẻ như ngay cả khi Chế độ phát triển đã dừng, tôi vẫn phải xóa tệp trước khi kéo nó. Đây là trên Windows bằng cách sử dụng plugin chuyển đổi cho Eclipse.


0

Biến thể 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);
        }
    }
}

Có, nó sẽ mất thời gian và 30 giây. là một giới hạn. Tôi đang nghĩ đến việc đặt một mẫu ứng dụng ajax để tự động hóa sau 30 giây.


Đây thậm chí không phải là php hợp lệ. import? Định nghĩa một hằng số như một thể hiện đối tượng?
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

Nếu bạn đang sử dụng ndb, phương pháp phù hợp với tôi để xóa kho dữ liệu:

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

1
Tôi không nghĩ rằng điều này sẽ hiệu quả. Appengine phàn nàn về Sorry, unexpected error: The kind "__Stat_Kind__" is reserved.Điều này có vẻ như appengine có một số thực thể thống kê nội bộ có thể được tiếp xúc bằng phương pháp này (có thể lỗi trên cuối cùng của họ?)
disappearedng

0

Đối với bất kỳ kho dữ liệu nào trên công cụ ứng dụng, thay vì cục bộ, bạn có thể sử dụng API Kho dữ liệu mới . Đây là phần sơ lược về cách bắt đầu .

Tôi đã viết một tập lệnh xóa tất cả các thực thể không được tạo sẵn. API đang thay đổi khá nhanh, vì vậy để tham khảo, tôi đã sao chép nó theo cam kết 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
  • Tiếp tục ý tưởng về svpino, đó là sự khôn ngoan khi sử dụng lại các bản ghi được đánh dấu là xóa. (ý tưởng của anh ấy không phải là xóa, nhưng đánh dấu là "đã xóa" các bản ghi không sử dụng). một chút bộ nhớ đệm / memcache để xử lý bản sao đang làm việc và chỉ ghi sự khác biệt của trạng thái (trước và sau tác vụ mong muốn) vào kho dữ liệu sẽ làm cho nó tốt hơn. đối với các nhiệm vụ lớn, có thể ghi các phần khác biệt ngay lập tức vào kho dữ liệu để tránh mất dữ liệu nếu memcache biến mất. để chống mất mát, có thể kiểm tra tính toàn vẹn / tồn tại của các kết quả được ghi nhớ và khởi động lại tác vụ (hoặc phần bắt buộc) để lặp lại các tính toán bị thiếu. khi sự khác biệt dữ liệu được ghi vào kho dữ liệu, các tính toán bắt buộc sẽ bị loại bỏ trong hàng đợi.

  • ý tưởng khác tương tự như bản đồ giảm là phân đoạn loại thực thể thành một số loại thực thể khác nhau, vì vậy nó sẽ được thu thập cùng nhau và hiển thị dưới dạng loại thực thể duy nhất cho người dùng cuối cùng. mục nhập chỉ được đánh dấu là "đã xóa". khi số lượng mục nhập "đã xóa" trên mỗi phân đoạn vượt qua một số giới hạn, các mục nhập "còn sống" sẽ được phân phối giữa các phân đoạn khác và phân đoạn này bị đóng vĩnh viễn và sau đó bị xóa thủ công khỏi bảng điều khiển dành cho nhà phát triển (đoán với chi phí thấp hơn) cập nhật: có vẻ như không có bảng thả trên bảng điều khiển, chỉ xóa từng bản ghi theo giá thông thường.

  • có thể xóa bằng cách truy vấn bởi các khối lớn các bản ghi mà không bị lỗi gae (ít nhất là hoạt động cục bộ) với khả năng tiếp tục trong lần thử tiếp theo khi hết thời gian:


    qdelete.getFetchPlan().setFetchSize(100);

    while (true)
    {
        long result = qdelete.deletePersistentAll(candidates);
        LOG.log(Level.INFO, String.format("deleted: %d", result));
        if (result <= 0)
            break;
    }
  • đôi khi cũng hữu ích khi tạo trường bổ sung trong bảng chính thay vì đặt các ứng viên (bản ghi liên quan) vào bảng riêng biệt. và có, trường có thể là mảng không lập chỉ mục / tuần tự hóa với chi phí tính toán thấp.

0

Đối với tất cả những người cần một giải pháp nhanh chóng cho máy chủ nhà phát triển (tại thời điểm viết bài vào tháng 2 năm 2016):

  1. Dừng máy chủ nhà phát triển.
  2. Xóa thư mục đích .
  3. Xây dựng lại dự án.

Thao tác này sẽ xóa tất cả dữ liệu khỏi kho dữ liệu.


0

Tôi đã rất thất vọng về các giải pháp hiện có để xóa tất cả dữ liệu trong kho dữ liệu trực tiếp nên tôi đã tạo một ứng dụng GAE nhỏ có thể xóa khá nhiều dữ liệu trong vòng 30 giây.

Cách cài đặt, v.v.: https://github.com/xamde/xydra


0

Đối với 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);

Hoạt động tốt trong Máy chủ phát triển


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.