Peewee-Pythonの軽量で柔軟性があり、非常に高速なORM

画像

すべてのジャングスト/錬金術師は少し反応して、入門チュートリアルと一部Peeweeのドキュメントの自由な解釈を読むことをお勧めします-スタンドアロンORM。 彼女についてはほとんど書かれていませんが、無駄です。 特にActiveRecordのORMに慣れている場合は、Peeweeと友達になるのは非常に簡単です。 さらに重要なことは、彼女と友達になることは素晴らしいことです:)さて、始めましょう。


設置
ピップ付き:
pip install peewee 


リポジトリから:
 git clone https://github.com/coleifer/peewee.git cd peewee python setup.py install 


テスト:
 python setup.py test 


フラスコにはバインディングがあります:
 pip install flask-peewee 



パターンまたは「ジャンガのスマック」の定義


次のコードはすべて、インタラクティブインタープリターまたは別のスクリプトで1対1で繰り返すことができます。

 from peewee import * db = SqliteDatabase('people.db') class Person(Model): name = CharField() birthday = DateField() is_relative = BooleanField() class Meta: database = db #      'people.db' 


すべての場面で 、多くのタイプのフィールドがあります。 Peeweeは、Pythonオブジェクトをデータベースに適した値に、またはその逆に変換します。

引数の初期化


各フィールドは次の初期化引数を取ります。


メタデータ


各テーブルについて、 class Meta統一メタデータを書くことができます:

オプション説明継承?
databaseモデルデータベースはい
db_tableデータが保存されるテーブルの名前いや
indexesインデックスを作成するフィールドのリストはい
order_byデフォルトでソートするフィールドのリストはい
primary_key複合主キー、CompositeKeyクラスのインスタンス、 はい
table_aliasクエリで使用するテーブルエイリアスいや


外部キーを介してモデル間の関係を設定してみましょう。 peeweeでは簡単です:

 class Pet(Model): owner = ForeignKeyField(Person, related_name='pets') name = CharField() animal_type = CharField() class Meta: database = db #      'people.db' 


モデルが説明されていますが、データベースにそれらに適切なテーブルを作成することは残っています。

 >>> Person.create_table() >>> Pet.create_table() 


データを操作する


たとえば、少数の人々を作成し、ペットを取得します。

 >>> from datetime import date >>> uncle_bob = Person(name='Bob', birthday=date(1960, 1, 15), is_relative=True) >>> uncle_bob.save() # c     


レコードは、明示的なsave()なしでModel.create()メソッドを使用して直接作成することもできます。

 >>> grandma = Person.create(name='Grandma', birthday=date(1935, 3, 1), is_relative=True) >>> herb = Person.create(name='Herb', birthday=date(1950, 5, 5), is_relative=False) 


私たちは姓を持つおばあちゃんを喜ばせます:

 >>> grandma.name = 'Grandma L.' >>> grandma.save() #   grandma 


次に、いくつかの生き物を生成します。 おばあちゃんは猫にアレルギーがありますが、紋章にはいくつかの問題あります

 >>> bob_kitty = Pet.create(owner=uncle_bob, name='Kitty', animal_type='cat') >>> herb_fido = Pet.create(owner=herb, name='Fido', animal_type='dog') >>> herb_mittens = Pet.create(owner=herb, name='Mittens', animal_type='cat') >>> herb_mittens_jr = Pet.create(owner=herb, name='Mittens Jr', animal_type='cat') 


ある時点で、ヴァレシュカは紋章付き外衣との生活にうんざりしており、開いた窓を使用して、彼は誇らしげに日没に走りました。 個人の自由に対する彼の権利を尊重しながら、それにもかかわらずデータベースから対応するエントリを削除します。

 >>> herb_mittens.delete_instance() # ,  1 


お気づきかもしれませんが、削除操作は削除されたレコードの数、この場合は1を返します。

ボブおじさんは、紋章には非常に多くの動物がいると判断し、彼からフィドを絞りました。

 >>> herb_fido.owner = uncle_bob >>> herb_fido.save() >>> bob_fido = herb_fido #        


セレクション


選択はクラスオブジェクトで直接実行され、SelectQueryインスタンス(jungのQuerySetのアナログ)を返します。

単一のレコードを取得する


単一のレコードを取得するには、 SelectQuery.get()メソッドを使用します。

 >>> grandma = Person.select().where(Person.name == 'Grandma L.').get() 


get()引数を直接代入することにより、クエリを短縮できます。

 >>> grandma = Person.get(Person.name == 'Grandma L.') 


複数のレコードを取得する


Personサイクルのすべてのインスタンスを見てみましょう。

 >>> for person in Person.select(): ... print person.name, person.is_relative ... Bob True Grandma L. True Herb False 


Personインスタンスとそれらに関連付けられたすべてのエントリを見てみましょう。

 >>> for person in Person.select(): ... print person.name, person.pets.count(), 'pets' ... for pet in person.pets: ... print ' ', pet.name, pet.animal_type ... Bob 2 pets Kitty cat Fido dog Grandma L. 0 pets Herb 1 pets Mittens Jr cat 


私たちはすべての猫とその飼い主を捕まえます(またはその逆ですか?):

 >>> for pet in Pet.select().where(Pet.animal_type == 'cat'): ... print pet.name, pet.owner.name ... Kitty Bob Mittens Jr Herb 


join'ovがなければ:

 #     >>> for pet in Pet.select().join(Person).where(Person.name == 'Bob'): ... print pet.name ... Kitty Fido 


同じ選択を別の方法で抽出することもできます-オブジェクトをBobに明示的にリクエストに渡す:

 >>> for pet in Pet.select().where(Pet.owner == uncle_bob): ... print pet.name 


選択をアルファベット順にソートします。 これを行うには、 SelectQuery.order_by()メソッドを使用します。

 >>> for pet in Pet.select().where(Pet.owner == uncle_bob).order_by(Pet.name): ... print pet.name ... Fido Kitty 


年齢で人を並べ替える:

 >>> for person in Person.select().order_by(Person.birthday.desc()): ... print person.name ... Bob Herb Grandma L. 


もっと複雑なクエリを試してみましょう。 生まれた人をすべて選ぶ


 >>> d1940 = date(1940, 1, 1) >>> d1960 = date(1960, 1, 1) >>> for person in Person.select().where((Person.birthday < d1940) | (Person.birthday > d1960)): ... print person.name ... Bob Grandma L. 


ヒント
where((Person.birthday < d1940) | (Person.birthday > d1960))というクエリwhere((Person.birthday < d1940) | (Person.birthday > d1960))where(Person.birthday < d1940 or Person.birthday > d1960)として記述できますが、これを行わない方がよい peeweeは常にそのような記録を正しく処理するとは限りません。


そして今、トロボアン。 1940年から1960年の間に生まれたものを選択してください。

 >>> for person in Person.select().where((Person.birthday > d1940) & (Person.birthday < d1960)): ... print person.name ... Herb 


最後にもう1つ。 SQL関数を使用して、任意のレジスタで名前が「G」で始まるすべてのユーザーを選択します。

 >>> for person in Person.select().where(fn.Lower(fn.Substr(Person.name, 1, 1)) == 'g'): ... print person.name ... Grandma L. 


選択には、次のメソッドも使用します。


この短いチュートリアルが気に入った場合は、 公式ドキュメントにアクセスしてください。 一般的な問題の解決策を含むレシピや、基本機能を拡張するプラグインのセットなど、多くの興味深いものがあります

ボーナス


彼のブログの著者はORMの速度について尋ねられ、彼はそれに答えました。

私のマシンでは、ほとんどのタスクでpeeweeはDjangoやSQAよりも高速であり、Modelインスタンスを反復して返す場合もほぼ同じです。

私のコンピューターでは、peeweeはほとんどのタスクでDjangoとSQLAlchemyを上回り、反復とサンプルインスタンスで同等の結果を示しました。


その後、彼はgithubでベンチマークの結果を公開しました。 さまざまなシナリオで一般的なモデルをテストし、ForeignKeyを介して関連しました。 とても好奇心が強い

誰が気にして、ソース:


錬金術に代わる良い選択肢は何だと思いますか?

Source: https://habr.com/ru/post/J207110/


All Articles