Một số giải pháp ORM Python tốt là gì? [đóng cửa]


209

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

Tôi cũng đang xem Django, cái 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ể nhiều hơn một chút so với 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 cứ ai cũng có kinh nghiệm với các giải pháp ORM Python khác nhau có thể so sánh và đối chiếu các tính năng và chức năng, tốc độ, hiệu quả, v.v.?


ponyORM trông khá đẹp.
Niklas R

Ánh xạ quan hệ đối tượng (ORM) đã rất phổ biến trong nhiều ngôn ngữ lập trình và là một trong những lựa chọn thay thế tốt nhất cho SQL. Tôi đã được truyền cảm hứng từ phong cách xâu chuỗi phương pháp để tạo CQL cho dự án TRIADB của mình. healis.eu/triadb/#latest-release
Athanassios

Câu trả lời:


96

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

SQLAlchemy cũng có một lớp khai báo ẩn một số độ phức tạp và cung cấp cho nó một cú pháp kiểu ActiveRecord tương tự như Django ORM.

Tôi sẽ không lo lắng về việc Django "quá nặng". Nó được tách riêng đủ để bạn có thể sử dụng ORM nếu bạn muốn mà không 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, có lẽ tôi đã chọn SQLAlchemy.


7
Nhưng nếu bạn không thích ORM của Django và muốn sử dụng SA, chẳng hạn, bạn sẽ mất rất nhiều tính năng của django, như quản trị viên. Không phải là một breaker thỏa thuận, nhưng một đầu gối da.
Gregg Lind

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

8
Tôi sẽ lập luận rằng SQLAlchemy là bất cứ thứ gì ngoại trừ nhẹ - mặc dù nó có thể khá nhanh. Tôi sẽ ném dự án của mình vào hỗn hợp, nó được gọi là peewee và nó nói chuyện với các postgres. Vừa mới thêm hỗ trợ cho truy vấn kiểu django, quá! charlesleifer.com/docs/peewee
coleifer

3
Cũng xin lưu ý rằng Django ORM không hỗ trợ các khóa chính tổng hợp và SQLAlchemy hỗ trợ nó.
Marcin Kapusta

1
@yegle Tôi bối rối trước bình luận của bạn. Tôi không hiểu logic. Làm thế nào "khó tìm hướng dẫn ORDER BY DESCtrong tài liệu" ngụ ý "xấu cho mẫu hồ sơ hoạt động"?
jpmc26

108

Nếu bạn đang tìm kiếm trọng lượng nhẹ và đã quen thuộc với các mô hình khai báo theo phong cách django, hãy xem peewee: https://github.com/coleifer/peewee

Thí 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 các tài liệu để biết thêm ví dụ.


bạn có thể giúp tôi cho câu hỏi này? Xin ru.stackoverflow.com/q/1114189/293323
Cookie

81

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ó không gây đau đớn khi thả xuống SQL thô khi bạn cần:

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

Cần lưu ý rằng Storm chỉ hỗ trợ MySQL và PostgreSQL tại thời điểm hiện tại. Hỗ trợ của Oracle đang hoạt động.
Jason Baker

15
Nó cũng hỗ trợ SQLite như ví dụ trên gợi ý
shearichard

2
quick_orm đơn giản như Storm và nó được xây dựng dựa trên SQLAlchemy nên nó cũng rất mạnh: pypi.python.org/pypi/quick_orm . Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của quick_orm
Tyler Long

8
Bão là không rõ. Tôi sẽ không sử dụng nó cho các dự án mới.
Matthias Urlichs

3
Ngoài ra, có vẻ như không có Storm cho Python 3
ygormutti

27

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

Nếu bạn đang dự định sử dụng CherryPy, bạn cũng có thể xem xét dejavu giống như của Robert Brewer (người đứng đầu dự án CherryPy hiện tại). Cá nhân tôi đã không sử dụng nó, nhưng tôi biết một số người yêu thích nó.

SQLObject dễ sử dụng ORM hơn một chút so với SQLAlchemy, nhưng nó không mạnh bằng.

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


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

1
@Lucas - SQLAlchemy cũng vậy ...
Jason Baker

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

@Lucas - Tôi hình như vậy. Chỉ cần nghĩ rằng tôi sẽ ghi chú về nó. :-)
Jason Baker

17

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

Base = declarative_base()

class Foo(Base):
    __tablename__ = 'foos'
    id = Column(Integer, primary_key=True)

class Thing(Base):
    __tablename__ = 'things'

    id = Column(Integer, primary_key=True)
    name = Column(Unicode)
    description = Column(Unicode)
    foo_id = Column(Integer, ForeignKey('foos.id'))
    foo = relation(Foo)

engine = create_engine('sqlite://')

Base.metadata.create_all(engine)  # issues DDL to create tables

session = sessionmaker(bind=engine)()

foo = Foo()
session.add(foo)
thing = Thing(name='thing1', description='some thing')
thing.foo = foo  # also adds Thing to session
session.commit()

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, kế thừa bảng. 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 ORM nhanh. Nó có thể tiết kiệm thời gian của bạn.
Tyler Long

18
:) tại Tyler nói với người tạo ra SQLAlchemy rằng anh ta nên sử dụng ORM nhanh.
Anthony Briggs

5
:) Nhắc nhở tôi về một người nào đó nhiều năm trước trên usenet đang tranh cãi với dmr @ alice rằng anh ta không thực sự hiểu C.
Peter Rowell

@AnthonyBriggs, kiểm tra trượt này và bạn sẽ thấy lý do tại sao quick_orm là xử lý tốt hơn các mối quan hệ phức tạp hơn SQLAlchemy: slideshare.net/tyler4long/quickorm
Tyler dài

10

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 lên trên SQLAlchemy, làm cho nó trông giống như các bộ phận đối xứng "mẫu ActiveRecord".


2
SQLAlchemy hỗ trợ OOP và các kiểu chức năng vượt trội, Elixir thêm kiểu lập trình khai báo (chủ yếu cho các khai báo mô hình nhưng có thể được sử dụng) trên đầu trang.
muhuk

5

Đây dường như là điểm tham chiếu chính cho tương tác cơ sở dữ liệu cấp cao trong Python: http://wiki.python.org/moin/HigherLevelDatabaseProgramming

Từ đó, có vẻ như Dejavu triển khai mẫu DataMapper của Martin Fowler khá trừu tượng trong Python.


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

1

Tôi nghĩ rằng bạn có thể nhìn vào:

Mùa thu

Bão táp


Mùa thu có lẽ dễ hơn Storm, nhưng Storm bao gồm 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 rất nhanh!
alecwh

Cảm ơn bạn, Autumn trông rất đẹp và hấp dẫn, nhưng không có tài liệu nào, đó là một công cụ đối phó với tôi.
temoto

1
Tôi vừa thử một số ví dụ trên trang Mùa thu và chúng thậm chí không hoạt động 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ũ. Hình như dự án đang chết dần chết mòn. Không khuyến khích sử dụng nó.
Jason Miesionczek

Mặt khác, Storm đang nhanh chóng trở thành ORM của tôi. Tài liệu đang trở nên tốt hơn và API sạch sẽ và đơn giản, mặc dù tôi đã quen với mẫu ActiveRecord hơn một chút do Django ORM sử dụng, tôi thấy Storm rất dễ điều hướng.
Jason Miesionczek

1
Autum dường như không có bất kỳ hoạt động nào trong một năm. Groups.google.com/group/autumn-orm
Sridhar Ratnakumar

1

Không có cách nào có thể hiểu được rằng các tính năng không được 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.


8
có một concievable cách
bukzor

0

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 quy trình dẫn đến ngoại lệ "Cơ sở dữ liệu bị khóa". Tôi đã chuyển sang SQLAlchemy và cùng một mã không hoạt động.


7
Công bằng mà nói, SQLite không thực sự được thiết kế để truy cập đồng thời.
Xiong Chiamiov

2
@Xion +1. SQLITE là một tệp duy nhất, không có trình nền chạy.
e-satis

-1

SQLAlchemy rất, rất mạnh. Tuy nhiên, nó không an toàn cho chuỗi, đảm bảo bạn ghi nhớ điều đó khi làm việc với cherrypy ở chế độ luồng-luồng.


2
Có đúng là SQLAlchemy không an toàn không? Vậy thì nó được sử dụng như thế nào trong các ứng dụng Kim tự tháp trên WSGI, mà chủ yếu mọi người triển khai ở chế độ luồng? Bất kỳ xác nhận cho tuyên bố mâu thuẫn này.
Ravi Kumar

1
Tất nhiên SQLAlchemy là an toàn chủ đề.
Matthias Urlichs

-7

Tôi sẽ kiểm tra SQLAlchemy

Nó thực sự dễ sử dụng và các mô hình bạn làm việc không hề tệ chút nào. Django sử dụng SQLAlchemy cho ORM của nó nhưng việc sử dụng nó cho phép bạn sử dụng toàn bộ sức mạnh của nó.

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

>>> 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')>

18
Django không sử dụng sqlalchemy cho ORM. Đã có một số công việc được thực hiện để biến sqlalchemy thành một ORM tùy chọn, nhưng nó chưa hoàn thành.
sherbang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.