2010-11-17 34 views
5

Tôi nghi ngờ cách các đối tượng được lưu trữ. Giả sử tôi có một lớp được định nghĩa như sau:Các lớp mô hình Google App Engine được lưu trữ như thế nào?

class SomeEntity(db.Model): 
    some_number = db.IntegerProperty(required=True) 

    def calculate_something(self): 
     return self.some_number * 2 

đoán của tôi là điều duy nhất được lưu trữ trong lưu trữ dữ liệu là tên/giá trị/loại some_number cùng với tên đầy đủ của lớp (SomeEntity). Tuy nhiên tôi đã không vấp phải bất kỳ thông tin nào xác nhận điều này.

1) Có ai có thể xác nhận điều này không?

Tôi muốn xác nhận rằng tôi có thể thay đổi (và thêm/xóa) các phương pháp mà không làm ảnh hưởng đến dữ liệu được lưu trữ.

2) Hơn nữa, điều gì xảy ra với các đối tượng hiện có nếu tôi thêm thuộc tính mới vào lớp (và nếu thuộc tính đó có required=true) thì sao?

Trả lời

10

Thực thể được lưu trữ trong kho dữ liệu trong biểu diễn protobuf (bao gồm khóa của nó - bao gồm ID ứng dụng của bạn và Loại của tổ chức). Bài viết Life of a Datastore Write nói nhiều hơn về cách trình bày các thực thể và cách chúng được ghi vào kho dữ liệu. Kiểm tra phần còn lại của các bài viết trong loạt bài này để biết thêm thông tin chi tiết.

1) Các phương thức không mang về dữ liệu được lưu trữ với pháp nhân của bạn, vì vậy bạn có thể thêm/xóa/thay đổi chúng mà không ảnh hưởng đến việc trình bày dữ liệu của bạn.

2) Kho dữ liệu là sơ đồ (không giống như cơ sở dữ liệu SQL điển hình). Thay đổi Model của bạn không ảnh hưởng đến dữ liệu trong kho dữ liệu. Khi bạn truy xuất một thực thể hiện có, nếu nó thiếu trường required thì lỗi sẽ được nâng lên. Ngoài ra, nếu bạn không yêu cầu và cung cấp mặc định, thì mặc định sẽ được sử dụng cho trường bị thiếu.

Nếu bạn cần di chuyển mô hình cũ sang mô hình mới, bạn có thể muốn xem xét sử dụng thư viện appengine-mapreduce để lặp qua tất cả các đối tượng của mình và di chuyển từng cá nhân. Đọc thêm về di chuyển giản đồ here.

+0

+1 Cảm ơn rất nhiều David. Đó chính là thông tin tôi cần. –

3

Chúng được lưu trữ dưới dạng bộ đệm giao thức. Bạn có thể đọc một số chi tiết trong bài viết "How Entities and Indexes are Stored".

Bạn có thể nhìn thấy những gì đang thực sự được lưu trữ với:

db.model_to_protobuf(your_entity) 

Nó là an toàn để thêm/gỡ bỏ các phương pháp, chỉ cần cẩn thận về việc ghi đè built-in phương pháp.

Bao gồm giá trị mặc định nếu bạn thêm thuộc tính được yêu cầu. Các thực thể hiện tại sẽ không được cập nhật cho đến khi bạn đặt lại thực thể.

+0

+1 Cảm ơn bạn Robert. Trông giống như một bài viết thú vị. –

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