いくつかの優れたPython ORMソリューションは何ですか?[閉まっている]


209

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

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

誰もが、その特徴と機能、速度、効率などを比較対照できるさまざまなPython ORMソリューションの経験がありますか?


ponyORMはとても素敵に見えます。
Niklas R

オブジェクトリレーショナルマッピング(ORM)は、多くのプログラミング言語で既に非常に人気があり、SQLの最良の代替手段の1つです。私は、TRIADBプロジェクト用のCQLを作成するためのメソッドチェーンスタイルからインスピレーションを受けました。healis.eu/triadb/#latest-release
Athanassios

回答:


96

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

SQLAlchemyには、いくらかの複雑さを隠し、Django ORMに似たActiveRecordスタイルの構文を提供する宣言型レイヤーもあります。

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

とはいえ、Webレイヤーに既にCherryPyを使用していて、ORMが必要なだけの場合は、おそらくSQLAlchemyを選択します。


7
しかし、DjangoのORMが気に入らず、たとえばSAを使用したい場合、adminなどのdjangoの多くの機能が失われます。取引ブレーカーではなく、皮をむいた膝。
グレッグ・リンド

22
確かに、しかし単にPython ORMを選択することに関する質問とは無関係です。自動生成された管理インターフェイスやその他のフレームワークコンポーネントについてではありません。
カールマイヤー

8
SQLAlchemyは軽量ではありませんが、かなり高速になる可能性があります。私のプロジェクトをミックスに投入します。peeweeと呼ばれ、postgresとやり取りします。つい最近、djangoスタイルのクエリのサポートも追加されました! charlesleifer.com/docs/peewee
coleifer

3
また、Django ORMは複合主キーをサポートしておらず、SQLAlchemyはそれをサポートしています。
Marcin Kapusta 2013

1
@yegleコメントに混乱しています。論理がわかりません。「ORDER BY DESCドキュメントで指示を見つけるのが難しい」というのは、「アクティブなレコードパターンに悪い」という意味ですか?
jpmc26 2014年

108

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

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


この質問を手伝ってくれませんか?Pls ru.stackoverflow.com/q/1114189/293323
Cookie

81

は間違いなく最も単純な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()

現時点では、StormはMySQLとPostgreSQLのみをサポートしていることに注意してください。Oracleのサポートは現在進行中です。
Jason Baker、

15
上記の例に
示さ

2
quick_ormはStormと同じくらいシンプルで、SQLAlchemyに基づいて構築されているため、非常に強力です:pypi.python.org/pypi/quick_orm。免責事項:私はquick_ormの作成者です
タイラーロング

8
嵐は維持されていません。新しいプロジェクトには使用しません。
Matthias Urlichs 2014年

3
また、Python 3にはストームがないようです
ygormutti 14

27

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

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

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

個人的には、プロジェクト全体をDjangoで書くつもりでない限り、Django ORMは使用しませんが、それは私だけです。


SQLObjectはすばらしい-使いやすく、データベースに依存せず、実際にテーブルを作成できます!(私は怠け者)。
Lucas Jones

1
@Lucas-SQLAlchemyも同じように...
Jason Baker

私が覚えている限り、私はSQLObjectをほめたたえているだけです。それはずっと前のことですが... :)
ルーカスジョーンズ

@ルーカス-私はそのように考えました。書き留めておきたいと思ったところです。:-)
Jason Baker

17

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

しかし、one_to_many、many_to_many、テーブルの継承などの多くの関係がある場合、状況は非常に複雑になります。それらを処理するには、手作業で多くのコードを記述する必要があります。Quick ORMの私の回答を確認してください。時間を節約できます。
タイラーロング

18
:) Tylerで、SQLAlchemyの作成者にQuick ORMを使用するように指示しています。
Anthony Briggs

5
:)彼は本当にC.を理解していなかったことをアリス@ DMRと議論Usenetで前に誰かの年を思い出す
ピーター・ローウェル

@AnthonyBriggs、このスライドを確認すると、quick_ormがSQLAlchemyよりも複雑な関係の処理に優れている理由がわかります。slideshare.net/ tyler4long
Tyler Long

10

SQLAlchemyと一緒にElixirを使用しており、これまでのところ気に入っています。エリクサーは、SQLAlchemyの上にレイヤーを配置し、「ActiveRecordパターン」のカウンターパートのように見せます。


2
SQLAlchemyはOOPと関数スタイルをすぐにサポートし、Elixirはその上に宣言型プログラミングスタイル(主にモデル宣言用ですが、拡張できる)を追加します。
muhuk 2008

5

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

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


私は興味があり、デジャヴを見ました。少しだけ。ドキュメンテーションは非常にまばらなので(qoute「自分でプレゼンテーションレイヤーを作成する場合」)、上級ユーザーだけが私が言うでしょう。
r4。

1

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


秋はおそらくStormよりも簡単ですが、StormにはAutumnにはない多くの機能が含まれています。これらのオプションはどちらもドキュメントが限られていますが、Stormはその速さで修正しています!
alecwh 2009

ありがとう、Autumnはとても見栄えがよく魅力的ですが、ドキュメントがありません。
temoto

1
私は秋のページのいくつかの例を試しましたが、パッケージマネージャーがインストールしたコードのバージョンでは動作しません。googleグループの投稿も古いです。プロジェクトがゆっくり死にかけているようです。それを使用することをお勧めしません。
Jason Miesionczek

一方、嵐はすぐに私のORMの選択肢になりつつあります。ドキュメントは改善されており、APIはクリーンでシンプルですが、Django ORMで採用されているActiveRecordパターンには少し慣れていますが、Stormは簡単にナビゲートできます。
Jason Miesionczek

1
Autumは1年間活動がないようです。groups.google.com/group/autumn-orm
Sridhar Ratnakumar

1

Djangoの未使用の機能がパフォーマンスを低下させると考えられる方法はありません。プロジェクトの規模を拡大することにした場合に便利です。


8
そこにあるconcievable方法は
bukzor

0

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


7
公平を期すために、SQLiteは実際には同時アクセス用に設計されていません。
Xiong Chiamiov 2011年

2
@Xion +1。SQLITEは、デーモンが実行されていない唯一のファイルです。
e-satis、2011年

-1

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


2
SQLAlchemyがスレッドセーフではないのは本当ですか?次に、主にスレッドモードで展開されるWSGI上のPyramidアプリでどのように使用されますか?この矛盾するステートメントに対する確認。
Ravi Kumar 2013

1
もちろんSQLAlchemyはスレッドセーフです。
Matthias Urlichs 2014年

-7

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

18
DjangoはORMにsqlalchemyを使用しませ。sqlalchemyをオプションのORMにするためにいくつかの作業が行われましたが、完全ではありません。
シェルバン2008
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.