좋은 Python ORM 솔루션에는 어떤 것이 있나요?[닫은]
문제
저는 기본적으로 백엔드에서 Python 웹 서비스와 통신하는 클라이언트측(브라우저)의 JavaScript 프런트엔드인 프로젝트에 CherryPy를 사용하여 평가하고 살펴보고 있습니다.따라서 백엔드에는 Python을 사용하여 구현할 수 있고 ORM(브라우저에는 JSON)을 통해 PostgreSQL DB와 통신할 수 있는 빠르고 가벼운 것이 정말로 필요합니다.
나는 또한 ORM이 내장되어 있기 때문에 내가 좋아하는 Django를 보고 있습니다.하지만 Django는 제가 실제로 필요한 것보다 조금 더 많을 수도 있다고 생각합니다(예:실제로 필요한 것보다 더 많은 기능 == 느림?).
특징과 기능, 속도, 효율성 등을 비교하고 대조할 수 있는 다양한 Python ORM 솔루션을 사용해 본 경험이 있는 사람이 있나요?
해결책
SQLAlchemy는 더욱 모든 기능을 갖추고 강력합니다(DataMapper 패턴 사용).Django ORM은 더 깔끔한 구문을 가지며 작성하기가 더 쉽습니다(ActiveRecord 패턴).성능 차이는 잘 모르겠습니다.
SQLAlchemy에는 선언적 레이어 이는 약간의 복잡성을 숨기고 Django ORM과 더 유사한 ActiveRecord 스타일 구문을 제공합니다.
나는 Django가 "너무 무겁다"는 것에 대해 걱정하지 않을 것입니다. 나머지를 가져올 필요없이 원한다면 ORM을 사용할 수있을 정도로 분리되어 있습니다.
즉, 이미 웹 계층에 CherryPy를 사용하고 있고 ORM만 필요하다면 아마도 SQLAlchemy를 선택할 것입니다.
다른 팁
경량을 찾고 있고 이미 django 스타일의 선언적 모델에 익숙하다면 peewee를 확인하세요.https://github.com/coleifer/peewee
예:
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')
을 체크 해봐 문서 더 많은 예를 보려면.
폭풍 틀림없이 가장 간단한 API가 있습니다.
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()
그리고 다음과 같은 경우 원시 SQL을 사용하는 것이 간편해집니다.
store.execute('UPDATE bars SET bar_name=? WHERE bar_id like ?', [])
store.commit()
나는 보통 사용한다 SQLAlchemy.꽤 강력하며 아마도 가장 성숙한 Python ORM일 것입니다.
CherryPy를 사용할 계획이라면 다음을 살펴보세요. 데자뷰 Robert Brewer(현재 CherryPy 프로젝트 리더인 사람)가 쓴 것입니다.나는 개인적으로 그것을 사용하지 않았지만 그것을 좋아하는 사람들을 알고 있습니다.
SQL객체 SQLAlchemy보다 ORM을 사용하기가 조금 더 쉽지만 그다지 강력하지는 않습니다.
개인적으로 저는 전체 프로젝트를 Django로 작성할 계획이 아니라면 Django ORM을 사용하지 않을 것입니다. 하지만 그게 바로 저입니다.
SQLAlchemy의 선언적 0.5에서 표준이 된 확장 기능은 Django나 Storm과 매우 유사한 올인원 인터페이스를 제공합니다.또한 데이터매퍼 스타일을 사용하여 구성된 클래스/테이블과 원활하게 통합됩니다.
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()
우리는 사용 엘릭서 SQLAlchemy와 함께 지금까지 좋아했습니다.Elixir는 SQLAlchemy 위에 레이어를 배치하여 "ActiveRecord 패턴" 카운터 부분과 더 유사하게 보이게 합니다.
이는 Python의 상위 수준 데이터베이스 상호 작용에 대한 표준 참조 포인트인 것 같습니다.http://wiki.python.org/moin/HigherLevelDatabase프로그래밍
거기에서 보면 다음과 같습니다 데자뷰 Martin Fowler의 DataMapper 패턴을 Python에서 상당히 추상적으로 구현합니다.
Django에서 사용되지 않는 기능으로 인해 성능이 저하될 가능성은 없습니다.프로젝트를 확장하기로 결정한 경우 유용할 수 있습니다.
SQLAlchemy는 매우 강력합니다.그러나 스레드로부터 안전하지 않으므로 스레드 풀 모드에서 Cherrypy로 작업할 때 이 점을 명심하십시오.
저는 소규모 프로젝트에 Storm + SQLite를 사용했고 다중 처리를 추가하기 전까지는 꽤 만족했습니다.여러 프로세스에서 데이터베이스를 사용하려고 하면 "데이터베이스가 잠겨 있습니다" 예외가 발생했습니다.SQLAlchemy로 전환했는데 동일한 코드가 문제 없이 작동했습니다.
나는 확인해 볼 것이다 SQLAlchemy
사용하기가 정말 쉽고 작업하는 모델도 전혀 나쁘지 않습니다. Django는 ORM을 위해 SQLAlchemy를 사용합니다. 하지만 그 자체로 사용하면 모든 기능을 사용할 수 있습니다.
다음은 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')>