2012-01-05 62 views
8

Tôi cần lặp lại và xóa tất cả các bản ghi của kho dữ liệu của mình. Tôi đang sử dụng Trình khởi chạy Google App engine để thử nghiệm trên máy chủ lưu trữ cục bộ. Làm thế nào để làm nó?Làm thế nào để xóa một bản ghi bằng GQL?

Khi tôi đang cố gắng để xóa tất cả recors trong mô hình Person rằng cách:

qObj = Person.all() 
db.delete(qObj) 

Tôi nhận lỗi BadValueError: Property y must be a str or unicode instance, not a long Tôi đoán có mâu thuẫn trong các kiểu dữ liệu mẫu.

class Person(db.Model): 
    name = db.StringProperty() 
    x = db.StringProperty() 
    y = db.StringProperty() 
    group = db.StringProperty() 

Trường y = db.StringProperty() trước đây là y = db.IntegerProperty(). Tại thời điểm này tôi cần xóa tất cả các bản ghi db. Làm thế nào tôi có thể làm điều đó?

Có cơ hội xóa tệp cục bộ lưu trữ tất cả bản ghi db không?

+0

Khi bạn thực hiện qObj = Person.all(), bạn đang đặt qObj thành danh sách đối tượng Person. Theo tôi biết, bạn không thể gọi xóa trên danh sách đó - bạn phải lặp qua danh sách và xóa riêng từng đối tượng. – pinerd314159

+0

http://code.google.com/appengine/docs/python/datastore/functions.html#create_config ... xóa (mô hình) Xóa một hoặc nhiều phiên bản mô hình khỏi kho dữ liệu. Đối số: mô hình Ví dụ về mô hình, Khóa cho thực thể hoặc danh sách (hoặc có thể lặp lại) của phiên bản mẫu hoặc khóa của thực thể cần xóa. –

+0

Tôi vừa thử ['db.delete (Person.all())'] (https://developers.google.com/appengine/docs/python/datastore/functions # delete), sử dụng mô hình 'Person' chính xác của bạn, và nó hoạt động hoàn hảo (xóa tất cả các đối tượng' Person' khỏi db) – bobobobo

Trả lời

8

Ngôn ngữ GQL chỉ có thể được sử dụng để lấy các thực thể hoặc chìa khóa (cf. http://code.google.com/appengine/docs/python/datastore/gqlreference.html)

Bạn sẽ phải làm điều này:

persons = Person.all() 

for p in persons: 
    p.delete() 

Về lỗi BadValueError: Property y must be a str or unicode instance, not a long, bạn sẽ phải sửa đổi tất cả dữ liệu (từ số nguyên thành chuỗi) trong cơ sở dữ liệu để giải quyết xung đột.

Dường như bạn muốn xóa mọi thứ, vì vậy một giải pháp khác là chỉ cần truy cập trang quản trị kho dữ liệu - http://localhost:8080/_ah/admin trên máy chủ cục bộ hoặc qua https://appengine.google.com/ - và xóa mọi thứ.

Bạn có thể tìm thấy điều này hữu ích: http://code.google.com/appengine/articles/update_schema.html

+0

Đây là __không đúng__. Bạn không cần 'for' rõ ràng. Đây là một trong hai cố định hoặc cái gì khác là sai – bobobobo

1

Nếu bạn có một biến lưu trữ một bản ghi trên cơ sở dữ liệu thì bạn có thể chỉ cần sử dụng delete().

Nghĩa là, nói rằng bạn có một thực thể gọi là người, bạn có thể làm:

personToDelete = db.GqlQuery("SELECT * FROM Persons WHERE name='Joe'"); 
person = personToDelete[0]; 
person.delete(); 

Bạn cũng phải nhập khẩu các thư viện cơ sở dữ liệu, nhưng tôi giả sử bạn làm điều đó nào cho rằng bạn đang sử dụng rõ ràng cơ sở dữ liệu.

+0

Điều này cho chúng ta một lỗi: đối tượng 'Truy vấn' không hỗ trợ lập chỉ mục. Chúng ta đang thiếu gì? – Praxiteles

0

Chỉ cần chia sẻ một mẹo hữu ích về câu trả lời đã được chấp nhận.

Bạn có thể làm như sau với db.delete:

persons = Person.all() 
d = [] 
for p in persons: 
    d.append(p) 

db.delete(d) 

này giúp tiết kiệm rất nhiều hoạt động db.

+0

Tôi nghĩ rằng điều này là rất kém hiệu quả. Bạn đang tạo một mảng hoàn toàn khác, nhưng bạn không cần. – bobobobo

+0

Điều này đã cho một lỗi "AttributeError: 'danh sách' đối tượng không có thuộc tính 'xóa'" Gợi ý? – Praxiteles

Các vấn đề liên quan