すべてのジャングスト/錬金術師は少し反応して、入門チュートリアルと一部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オブジェクトをデータベースに適した値に、またはその逆に変換します。
引数の初期化
各フィールドは次の初期化引数を取ります。
-
null=False
-null値を保存できますか? -
index=False
データベースの特定の列にインデックスを作成するかどうか。 -
unique=False
データベースのこの列に一意のインデックスを作成するかどうか。 複合インデックスに関する章も参照してください。 -
verbose_name=None
人間が読めるフィールドの表現の文字列。 -
help_text=None
フィールドの補助テキストを含む行。 -
db_column=None
このフィールドのデータベース内の列の名前を明示的に設定する文字列。たとえば、レガシーデータベースを操作するときに使用されます。 -
default=None
-インスタンス化時のクラスフィールドのdefault=None
値。 -
choices=None
-2要素のタプルのリストまたはタプル。最初の要素はベースの値、2番目の要素は表示値(jangと同様)。 -
primary_key=False
このフィールドを主キーとして使用するかどうか。 -
sequence=None
フィールドを埋めるためのシーケンス(バックエンドがこの機能をサポートしていることを確認してください);
メタデータ
各テーブルについて、
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.
もっと複雑なクエリを試してみましょう。 生まれた人をすべて選ぶ
- 1940年まで
- 1959年以降
>>> 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.
ヒント
というクエリ
、
として記述できますが、これを行わない方がよい peeweeは常にそのような記録を正しく処理するとは限りません。
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.
選択には、次のメソッドも使用します。
-
SelectQuery.group_by()
-
SelectQuery.having()
-
SelectQuery.limit()
およびSelectQuery.offset()
この短いチュートリアルが気に入った場合は、 公式ドキュメントにアクセスしてください。 一般的な問題の解決策を含むレシピや、基本機能を拡張するプラグインのセットなど、多くの興味深いものがあります 。
ボーナス
彼のブログの著者はORMの速度について尋ねられ、彼はそれに答えました。
私のマシンでは、ほとんどのタスクでpeeweeはDjangoやSQAよりも高速であり、Modelインスタンスを反復して返す場合もほぼ同じです。
私のコンピューターでは、peeweeはほとんどのタスクでDjangoとSQLAlchemyを上回り、反復とサンプルインスタンスで同等の結果を示しました。
その後、彼はgithubでベンチマークの結果を公開しました。 さまざまなシナリオで一般的なモデルをテストし、ForeignKeyを介して関連しました。 とても好奇心が強い 。
誰が気にして、ソース:
錬金術に代わる良い選択肢は何だと思いますか?