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を介して関連しました。 とても好奇心が強い



誰が気にして、ソース:





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



All Articles