2009-07-23 13 views
5

Tôi có hàng trăm nghìn đối tượng dựa trên các kiểu mẫu đơn giản (plone 2.5.X) cần lược đồ kiểu mẫu của chúng được cập nhật mới nhất. Công cụ di chuyển lược đồ nguyên mẫu là một công cụ tuyệt vời cho các đối tượng số lượng vừa/nhỏ nhưng đang đưa máy chủ của tôi đến đầu gối cố gắng di chuyển tất cả chúng đến điểm tôi luôn kết thúc kịch bản lệnh. Tôi muốn có thể cập nhật lược đồ của một đối tượng tại một thời điểm, có khả năng là đối tượng được truy xuất - điều đó có thể xảy ra không? Nếu không, bất kỳ phương pháp tiếp cận khác để cập nhật các lược đồ nguyên mẫu ở các trang web lớn?Làm cách nào để cập nhật lược đồ của một đối tượng nguyên mẫu duy nhất theo yêu cầu trong bản vẽ?

Cảm ơn trước!

+0

Xin lỗi, đã đọc câu hỏi của bạn quá nhanh. archetypes.schemaextender sẽ không giúp bạn ở đây. Tôi đã bỏ phiếu để xóa câu trả lời của mình. –

+0

Với các bình luận trên Lennarts anwer, nó là một tùy chọn để thêm một khách hàng ZEO và làm việc di chuyển ở đó? Điều này có thể ít tác động đến khả năng sử dụng của trang web hơn là lưu trữ nó * và * thực hiện di chuyển trên cùng một trường hợp. (Giả sử đó là những gì bạn đang làm.) –

+0

vâng, hiện tại tôi đang làm nhưng rất tiếc là dữ liệu quá nhiều. nó chỉ gây ra trao đổi lớn trên máy chủ zeo như vậy nếu bất kỳ yêu cầu thực sự đến trong nó mất một thời gian dài tốt đẹp để có được bất cứ điều gì đối tượng cần. Tất nhiên là lẻ tẻ. 2 yêu cầu ngắn và 5 yêu cầu siêu dài. thành công của nó có vẻ như không phải là một nâng cấp đơn giản. nếu tôi hiểu rõ hơn về quá trình này, tôi sẽ rất vui khi viết một cái nhưng một chút bí ẩn. Thật đáng ngạc nhiên vì nó không phù hợp với toàn bộ dữ liệu linh hoạt mà tôi mong đợi. Cảm ơn !!! – eleddy

Trả lời

0

Mặc dù bạn không giải thích những gì "mang đến đầu gối" có nghĩa là, tôi sẽ đoán rằng bạn hết bộ nhớ. Nếu vậy, đó có thể là một câu hỏi của kịch bản không cam kết thay đổi đĩa. Thêm một transaction.commit() trong vòng lặp (tốt nhất là với một phép thử để chỉ thực hiện mọi lần thứ 100 hoặc lần thứ 1000) nên sửa lỗi đó.

Chỉnh sửa: Vì vậy, tôi đã sai, đó không phải là vấn đề về bộ nhớ. Có vẻ như bản cập nhật nguyên mẫu thực hiện điều đúng.

+0

Thật không may, nó không chỉ là một vấn đề bộ nhớ. Cập nhật cũng gây ra tải (như đĩa IO) để tăng đột biến, và quan trọng hơn, người dùng cuối thấy hiệu ứng của bản cập nhật như slooooowness vì vậy tôi luôn luôn can thiệp bằng tay và giết nó. Luôn luôn có khả năng bị cúp kế hoạch nhưng tôi đang cố gắng tránh điều đó để cập nhật sơ đồ ngớ ngẩn. Tôi vừa mới chạy mã cập nhật công cụ nguyên mẫu chuẩn và dường như không thể tìm cách cập nhật một mục duy nhất, nếu không tôi sẽ vui lòng viết các vòng lặp và cam kết. bạn có thể đăng một ví dụ về cách bạn sẽ viết vòng lặp đó? Cảm ơn! – eleddy

+0

Vâng, tất nhiên IO sẽ tăng đột biến. Bạn có nghĩ rằng bạn có thể thực hiện một bản cập nhật lớn của cơ sở dữ liệu mà không cần phải ghi vào đĩa? Bạn dường như không thực sự có một vấn đề thực sự. Chạy nâng cấp nguyên mẫu. –

+0

Tất nhiên nó là một vấn đề khi trả tiền khách hàng hoặc nhận được thời gian phản ứng crap cho giờ hoặc một cúp hoàn toàn.Tôi nghĩ rằng nó rất công bằng để yêu cầu nâng cấp một mục tại một thời điểm và tôi nghĩ rằng đây sẽ là một câu trả lời đơn giản với một đoạn mã nhỏ. nếu nó không thể thì không thể và tôi sẽ bắt đầu xem xét các lựa chọn khác. Tôi đang tìm mã ở đây - không phải là bài giảng về vấn đề của tôi. – eleddy

5

sau khi đào bới mã Danh mục 2.5, cuối cùng tôi đã tìm thấy câu trả lời cho một bản cập nhật sơ đồ lười biếng:

if not self._isSchemaCurrent(): 
    logging.debug("updating schema for %s"%self.absolute_url()) 
     try: 
      import transaction 
      transaction.begin() 
      self._updateSchema() 
      transaction.commit() 
     except Exception, e: 
      logging.error('Error updating schema at %s: %s'%(self.absolute_url(), e)) 
      return False 
else: 
    logging.debug("schema for %s is up to date"%self.absolute_url()) 
    return True 

Lưu ý rằng đây là Plone 2.5.3 và từ những gì tôi đã được đào bới Plone 3 vẻ hơi khác. Đối với một số đối tượng mà tôi đã tùy chỉnh processForm, tôi thực hiện nâng cấp ở đó để biểu mẫu có thể hiển thị trường mới và nó sẽ được xử lý. Đối với những người khác chỉ trong móc at_post_edit_script vì những người thường không có nâng cấp giản đồ quan trọng lớn. Ngoài ra, quá trình xử lý biểu mẫu cũng là phần chậm nhất của trang web nên trải nghiệm người dùng không bị ảnh hưởng nhiều.

Bẻ khóa của nó nhưng nó không làm cho I/O bị bung ra và nó hoạt động với tất cả các phiên bản của đối tượng. Tôi sẽ lấy nó!

+0

Làm cách nào/bạn đang lấy mã đó ở đâu? – rjmunro

+0

@rjmunro Tôi có mã nguyên mẫu tùy chỉnh và tôi đặt mã này ở các vị trí khác nhau tùy thuộc vào tốc độ tôi cần nâng cấp. Hầu hết các địa điểm của nó là hook at_post_edit. Trong một trường hợp, tôi muốn nâng cấp xảy ra trước khi chỉnh sửa để tôi ghi đè processForm để nó nâng cấp trước khi chỉnh sửa. Bằng cách này tôi có thể thêm nội dung giản đồ mới theo cách thủ công vào biểu mẫu chỉnh sửa và sau đó không phải lo lắng về việc nó không dùng. Tôi cũng đã làm một cái gì đó tương tự cho việc cập nhật quy trình làm việc chỉ trong trường hợp đó, tôi đặt một cuộc gọi đến một kịch bản ở trên cùng của mẫu xem mà kích hoạt cập nhật trên xem. cho tôi biết nếu bạn muốn các ví dụ mã :) – eleddy

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