232

バックエンドでPython Webサービスと通信する、基本的にクライアント側(ブラウザ)からのJavaScriptフロントエンドであるプロジェクトにCherryPyを使用することを評価および検討しています。そのため、Python を使用して実装し、ORM (JSON からブラウザーへ) を介して PostgreSQL DB と通信できる、バックエンドに高速で軽量なものが本当に必要です。

ORMが組み込まれているので、私が気に入っているDjangoも検討しています。しかし、Django は私が本当に必要としているものより少し多すぎるかもしれません (つまり、私が本当に必要とするよりも多くの機能 == 遅い?)。

機能や機能、速度、効率などを比較対照できるさまざまな Python ORM ソリューションの経験がある人はいますか?

4

12 に答える 12

122

軽量を探していて、すでに 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')

その他の例については、ドキュメントを確認してください。

于 2011-09-16T02:58:48.330 に答える
121

SQLAlchemyは、よりフル機能で強力です(DataMapperパターンを使用)。Django ORMの構文はよりクリーンで、(ActiveRecordパターン)の記述が簡単です。パフォーマンスの違いについてはわかりません。

SQLAlchemyには、複雑さを隠し、DjangoORMにより類似したActiveRecordスタイルの構文を提供する宣言型レイヤーもあります。

Djangoが「重すぎる」ことを心配する必要はありません。残りをインポートせずに必要に応じてORMを使用できるように、十分に分離されています。

そうは言っても、すでにWebレイヤーにCherryPyを使用していて、ORMが必要な場合は、おそらくSQLAlchemyを選択します。

于 2008-09-10T13:37:05.410 に答える
81

Stormには、間違いなく最も単純な 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()
于 2008-12-21T18:36:20.770 に答える
29

私は通常SQLAlchemyを使用します。それはかなり強力で、おそらく最も成熟したpythonORMです。

CherryPyの使用を計画している場合は、Robert Brewer(現在のCherryPyプロジェクトリーダーである男)によるdejavuを調べることもできます。個人的には使ったことがありませんが、好きな人は知っています。

SQLObjectはSQLAlchemyよりもORMを使用するのが少し簡単ですが、それほど強力ではありません。

個人的には、プロジェクト全体をDjangoで作成する予定がない限り、Django ORMを使用することはありませんが、それは私だけです。

于 2008-09-10T15:02:58.310 に答える
17

0.5 で標準になりつつあるSQLAlchemy の宣言型拡張機能は、Django や Storm と非常によく似たオールインワン インターフェイスを提供します。また、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()
于 2009-01-02T17:56:37.930 に答える
10

SQLAlchemy と一緒にElixirを使用しており、これまでのところ気に入っています。Elixir は SQLAlchemy の上に層を置き、"ActiveRecord パターン" のカウンター パーツのように見せます。

于 2008-09-11T03:44:54.017 に答える
5

これは、Pythonでの高レベルのデータベースインタラクションの標準的な参照ポイントのようです: http ://wiki.python.org/moin/HigherLevelDatabaseProgramming

そこから、DejavuはMartinFowlerのDataMapperパターンをPythonでかなり抽象的に実装しているように見えます。

于 2011-03-21T23:29:54.587 に答える
1

Django で使用されていない機能によってパフォーマンスが低下することは考えられません。プロジェクトをアップスケールすることを決定した場合に役立つかもしれません.

于 2008-10-09T06:41:09.030 に答える
1

私はあなたが見るかもしれないと思う:

于 2008-09-10T04:56:53.757 に答える
0

私は小さなプロジェクトに Storm + SQLite を使用しましたが、マルチプロセッシングを追加するまではかなり満足していました。複数のプロセスからデータベースを使用しようとすると、「データベースがロックされています」という例外が発生しました。SQLAlchemy に切り替えたところ、同じコードで問題なく動作しました。

于 2011-02-05T18:28:40.360 に答える
-1

SQLAlchemy は非常に強力です。ただし、スレッドプールモードでcherrypyを使用する場合は、スレッドセーフではないことに注意してください。

于 2010-03-24T19:37:47.357 に答える
-7

I'd check out SQLAlchemy

It's really easy to use and the models you work with aren't bad at all. Django uses SQLAlchemy for it's ORM but using it by itself lets you use it's full power.

Here's a small example on creating and selecting orm objects

>>> 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')>
于 2008-09-10T05:19:34.780 に答える