2016-12-02 30 views
5

Đối với phiên bản cũ của kim tự tháp thiết lập cho phiên SQLAlchemy đã được thực hiện với scooped_session tương tự như sauPyramid với SQLAlchemy: chỉnh phạm vi hoặc không có phạm vi phiên cơ sở dữ liệu

DBSession = scoped_session(
    sessionmaker(
     autoflush=True, 
     expire_on_commit=False, 
     extension=zope.sqlalchemy.ZopeTransactionExtension() 
    ) 

Tuy nhiên tôi thấy rằng các hướng dẫn mới cũng như các kim tự tháp docs ' thúc đẩy 'sqlalchemy không có threadlocals trong đó DBSession được gắn vào đối tượng yêu cầu.

Cách 'cũ' bị hỏng và lợi thế của chuỗi không có chủ đề là gì?

Trả lời

8

Tôi dẫn đầu quá trình chuyển đổi này với sự trợ giúp của một số cộng tác viên khác đã viết blog về một số lợi thế. Về cơ bản nó tóm tắt theo triết lý kim tự tháp của việc làm cho nó có thể cho các ứng dụng được viết mà không yêu cầu bất kỳ biến toàn cục nào. Điều này thực sự quan trọng khi viết mã có thể tái sử dụng, có thể gộp lại. Nó làm cho các phụ thuộc mã của bạn (bề mặt api) rõ ràng, thay vì có các hàm ngẫu nhiên phụ thuộc vào cơ sở dữ liệu của bạn, mặc dù các chữ ký chức năng/biến thành viên của chúng không lộ ra các phụ thuộc đó. Điều này cũng giúp kiểm tra mã dễ dàng hơn vì bạn không phải lo lắng nhiều về các biến threadlocal. Với globals, bạn cần phải theo dõi những module nào có thể giữ các tham chiếu đến chúng và vá chúng để sử dụng đối tượng mới. Nếu không có globals, bạn chỉ cần truyền vào các đối tượng mà bạn muốn sử dụng và mã sử dụng chúng, giống như bất kỳ tham số nào khác cho một hàm hoặc trạng thái trên một đối tượng.

Rất nhiều người phàn nàn về việc phải chuyển cơ sở dữ liệu của họ sang tấn hàm. Đây là một mùi và chỉ có nghĩa là bạn không thiết kế tốt apis của bạn. Nhiều lần bạn có thể cấu trúc mọi thứ như một đối tượng được tạo ra một lần cho mỗi yêu cầu và lưu trữ các xử lý như một cái gì đó như self.dbsession, và mỗi phương pháp trên đối tượng bây giờ có quyền truy cập vào nó.

[1] https://metaclassical.com/testing-pyramid-apps-without-a-scoped-session/

+0

Bài đăng trên blog này gây ra câu hỏi, có ý nghĩa - cảm ơn – silviud

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