2008-09-10 46 views
181

Tôi đang đánh giá và xem xét sử dụng CherryPy cho một dự án cơ bản là một giao diện người dùng JavaScript từ phía máy khách (trình duyệt) nói chuyện với một dịch vụ web Python trên back-end. Vì vậy, tôi thực sự cần một cái gì đó nhanh chóng và nhẹ trên back-end mà tôi có thể thực hiện bằng cách sử dụng Python mà sau đó nói chuyện với DB PostgreSQL thông qua một ORM (JSON cho trình duyệt).Một số giải pháp ORM Python tốt là gì?

Tôi cũng đang xem Django, mà tôi thích, vì ORM của nó được tích hợp sẵn. Tuy nhiên, tôi nghĩ Django có thể là một chút nhiều hơn tôi thực sự cần (tức là nhiều tính năng hơn tôi thực sự cần == chậm hơn?).

Bất kỳ ai có kinh nghiệm với các giải pháp ORM Python khác nhau có thể so sánh và tương phản các tính năng và chức năng, tốc độ, hiệu quả, v.v. của họ?

+0

[ponyORM] (http://python-orm.com/) trông khá đẹp. –

Trả lời

79

SQLAlchemy được đầy đủ tính năng và mạnh mẽ (sử dụng mô hình DataMapper). Django ORM có cú pháp rõ ràng hơn và dễ viết hơn (mẫu ActiveRecord). Tôi không biết về sự khác biệt về hiệu suất.

SQLAlchemy cũng có một số declarative layer ẩn một số phức tạp và cung cấp cho nó cú pháp kiểu ActiveRecord giống với cú pháp ORM của Django hơn.

Tôi sẽ không lo lắng về Django là "quá nặng". Nó được tách ra đủ để bạn có thể sử dụng ORM nếu bạn muốn mà không cần phải nhập phần còn lại.

Điều đó nói rằng, nếu tôi đã sử dụng CherryPy cho lớp web và chỉ cần một ORM, tôi có thể chọn không tham gia SQLAlchemy.

+7

Nhưng nếu bạn không thích Django của ORM, và muốn sử dụng SA, ví dụ, bạn mất rất nhiều tính năng của django, như admin. Không phải là người chia bài, mà là đầu gối da. –

+18

Đúng, nhưng không liên quan đến câu hỏi, đơn giản chỉ là chọn một ORM Python; không phải về các giao diện quản trị được tạo tự động hoặc các thành phần khung công tác khác. –

+7

Tôi cho rằng SQLAlchemy là bất kỳ thứ gì ngoài trọng lượng nhẹ - tuy nhiên nó có thể khá nhanh. Tôi sẽ ném dự án của tôi trong hỗn hợp, nó được gọi là peewee và nó nói chuyện với postgres. Chỉ vừa mới thêm hỗ trợ cho truy vấn kiểu django, quá! http: // charlesleifer.com/docs/peewee/ – coleifer

1

Tôi nghĩ bạn có thể xem xét:

Autumn

Storm

+0

Mùa thu có lẽ dễ hơn Storm, nhưng Storm có nhiều tính năng mà Autumn không có. Cả hai tùy chọn này đều có tài liệu giới hạn, mặc dù Storm đang sửa chữa nhanh chóng! – alecwh

+0

Cảm ơn bạn, mùa thu trông rất đẹp và hấp dẫn, nhưng không có tài liệu hướng dẫn, đó là một máy cắt giao dịch cho tôi. – temoto

+1

Tôi vừa thử một số ví dụ trên trang Thu, và họ thậm chí không làm việc với phiên bản mã mà trình quản lý gói của tôi đã cài đặt. Các bài đăng trong nhóm google cũng cũ. Có vẻ như dự án đang chết một cách chậm chạp. Sẽ không khuyên bạn nên sử dụng nó. –

-5

tôi muốn kiểm tra SQLAlchemy

Nó thực sự dễ dàng để sử dụng và các mô hình bạn làm việc với không phải là xấu ở tất cả. Django sử dụng SQLAlchemy cho ORM nhưng tự sử dụng nó cho phép bạn sử dụng toàn bộ sức mạnh của nó.

Dưới đây là một ví dụ nhỏ vào việc tạo ra và chọn orm đối tượng

>>> ed_user = User('ed', 'Ed Jones', 'edspassword') 
>>> session.add(ed_user) 
>>> our_user = session.query(User).filter_by(name='ed').first() 
>>> our_user 
    <User('ed','Ed Jones', 'edspassword')> 
+17

Django không _not_ sử dụng sqlalchemy cho ORM của nó. Đã có một số công việc được thực hiện để làm sqlalchemy một ORM tùy chọn, nhưng nó không hoàn chỉnh. – sherbang

27

Tôi thường sử dụng SQLAlchemy. Nó khá mạnh mẽ và có lẽ là con trăn trưởng thành nhất ORM.

Nếu bạn dự định sử dụng CherryPy, bạn cũng có thể xem xét dejavu vì nó là của Robert Brewer (anh chàng hiện là trưởng nhóm dự án CherryPy). Cá nhân tôi đã không sử dụng nó, nhưng tôi biết một số người thích nó.

SQLObject dễ sử dụng hơn ORM so với SQLAlchemy, nhưng nó không hoàn toàn mạnh mẽ.

Cá nhân, tôi sẽ không sử dụng ORM Django trừ khi tôi đã lên kế hoạch viết toàn bộ dự án ở Django, nhưng đó chỉ là tôi.

+0

SQLObject là rất tuyệt vời - đơn giản để sử dụng, cơ sở dữ liệu- độc lập và nó thực sự có thể làm cho các bảng cho bạn! (Tôi lười). –

+1

@Lucas - Vì vậy, có thể SQLAlchemy ... –

+0

Theo như tôi có thể nhớ, tôi chỉ nói chung là lời khen ngợi SQLObject. Nó đã được một thời gian dài trước đây, mặc dù ... :) –

9

Chúng tôi sử dụng Elixir cùng với SQLAlchemy và đã thích nó cho đến nay. Elixir đặt một lớp trên đỉnh của SQLAlchemy khiến cho nó trông giống như các bộ đếm truy cập "mẫu ActiveRecord".

+2

SQLAlchemy hỗ trợ OOP và phong cách chức năng ra khỏi hộp, Elixir thêm kiểu lập trình khai báo (chủ yếu cho khai báo mô hình nhưng có thể được exdended) trên đầu trang của nó. – muhuk

1

Không có cách nào có thể hiểu được rằng các tính năng không sử dụng trong Django sẽ đưa ra một hình phạt hiệu suất.Có thể chỉ có ích nếu bạn quyết định nâng cấp dự án.

+6

có một cách * đáng tin cậy * – bukzor

76

Storm có cho là API đơn giản nhất:

from storm.locals import * 

    class Foo: 
     __storm_table__ = 'foos' 
     id = Int(primary=True) 


    class Thing: 
     __storm_table__ = 'things' 
     id = Int(primary=True) 
     name = Unicode() 
     description = Unicode() 
     foo_id = Int() 
     foo = Reference(foo_id, Foo.id) 

    db = create_database('sqlite:') 
    store = Store(db) 

    foo = Foo() 
    store.add(foo) 
    thing = Thing() 
    thing.foo = foo 
    store.add(thing) 
    store.commit() 

Và nó làm cho nó đau để thả xuống SQL liệu khi bạn cần phải:

store.execute('UPDATE bars SET bar_name=? WHERE bar_id like ?', []) 
store.commit() 
+3

Cảm ơn bạn đã hiển thị một ví dụ hoàn chỉnh. Bão thực sự rất dễ. – alecwh

+0

Cần lưu ý rằng Storm chỉ hỗ trợ MySQL và PostgreSQL tại thời điểm hiện tại. Oracle hỗ trợ là trong các công trình mặc dù. –

+15

Nó cũng hỗ trợ SQLite như ví dụ trên cho thấy – shearichard

17

declarative mở rộng SQLAlchemy, mà đang trở thành tiêu chuẩn trong 0,5, cung cấp tất cả trong một giao diện rất giống như của Django hoặc Storm. Nó cũng tích hợp liền mạch với các lớp/bảng được định cấu hình bằng cách sử dụng kiểu datamapper:

+0

Nhưng mọi thứ trở nên rất phức tạp nếu có nhiều mối quan hệ như one_to_many, many_to_many, bảng kế thừa. Bạn phải viết rất nhiều mã bằng tay để xử lý chúng. Kiểm tra câu trả lời của tôi cho Quick ORM. Nó có thể tiết kiệm thời gian của bạn. –

+15

:) tại Tyler nói với tác giả của SQLAlchemy rằng anh ta nên sử dụng ORM nhanh. –

+5

:) Nhắc tôi về một vài năm trước đây trên usenet tranh luận với dmr @ alice rằng anh ta không thực sự hiểu C. –

0

SQLAlchemy rất, rất mạnh. Tuy nhiên nó không phải là thread an toàn chắc chắn rằng bạn giữ cho rằng trong tâm trí khi làm việc với cherrypy trong chế độ thread-pool.

+1

có đúng là SQLAlchemy không phải là luồng không? Sau đó, nó được sử dụng như thế nào trong các ứng dụng Pyramid trên WSGI, mà chủ yếu là mọi người triển khai trong chế độ luồng? Bất kỳ xác nhận nào đối với tuyên bố mâu thuẫn này. –

+0

Tất nhiên SQLAlchemy là an toàn chỉ. –

-1

Tôi đã sử dụng Storm + SQLite cho một dự án nhỏ và khá hài lòng với nó cho đến khi tôi thêm đa xử lý. Cố gắng sử dụng cơ sở dữ liệu từ nhiều quá trình dẫn đến một ngoại lệ "Cơ sở dữ liệu bị khóa". Tôi chuyển sang SQLAlchemy, và cùng một mã làm việc không có vấn đề gì.

+7

Để công bằng, SQLite không thực sự được thiết kế để truy cập đồng thời. –

+2

@Xion +1. SQLITE là một tệp duy nhất, không có daemon chạy. –

4

này có vẻ là điểm tham chiếu kinh điển cho sự tương tác cơ sở dữ liệu cấp cao bằng Python: http://wiki.python.org/moin/HigherLevelDatabaseProgramming

Từ đó, nó trông giống như Dejavu thực hiện mô hình DataMapper Martin Fowler khá trừu tượng bằng Python.

+0

Tôi đã quan tâm và nhìn Dejavu. Chỉ một chút. Tài liệu là rất thưa thớt (qoute "cho các lớp trình bày bạn đang ở trên của riêng bạn") vì vậy chỉ cho người dùng cao cấp tôi sẽ nói. –

89

Nếu bạn đang tìm kiếm nhẹ và đã quen thuộc với các mô hình khai báo django-phong cách, hãy kiểm tra Peewee: https://github.com/coleifer/peewee

Ví dụ:

import datetime 
from peewee import * 

class Blog(Model): 
    name = CharField() 

class Entry(Model): 
    blog = ForeignKeyField(Blog) 
    title = CharField() 
    body = TextField() 
    pub_date = DateTimeField(default=datetime.datetime.now) 

# query it like django 
Entry.filter(blog__name='Some great blog') 

# or programmatically for finer-grained control 
Entry.select().join(Blog).where(Blog.name == 'Some awesome blog') 

Kiểm tra docs để biết thêm ví dụ.

+12

Điều này rất hữu ích, hãy tiếp tục công việc tốt! – rapadura

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