문제

저는 기본적으로 백엔드에서 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')>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top