Peewee - पाइथन में हल्का, लचीला और बहुत तेज ORM

छवि

मेरा सुझाव है कि सभी djangists / कीमियागर थोड़ा जवाब देते हैं और परिचयात्मक ट्यूटोरियल की एक मुक्त व्याख्या पढ़ते हैं और आंशिक रूप से Peewee प्रलेखन - स्टैंड-अलोन ORM, जो किसी भी पोषण विशेषज्ञ के परिचित के लिए अनिवार्य है, और विशेष रूप से, फ्लास्कर को। थोड़ा उसके बारे में लिखा है, लेकिन व्यर्थ में। Peewee के साथ दोस्ती करना बहुत आसान है, खासकर यदि आप पहले से ही ActiveRecord के कुछ ORM से परिचित हैं। इससे भी महत्वपूर्ण बात यह है कि उसके साथ दोस्ती करना अच्छा है :) खैर, शुरू करते हैं।


स्थापना
पाइप के साथ:
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 



पैटर्न की परिभाषा या "स्मूदी ऑफ़ जुन्गा"


निम्नलिखित सभी कोड एक इंटरैक्टिव दुभाषिया या एक अलग स्क्रिप्ट में एक से एक तक दोहराए जा सकते हैं।

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


सभी अवसरों के लिए , कई प्रकार के क्षेत्र हैं। Peewee डेटाबेस के लिए उपयुक्त मानों के लिए पायथन ऑब्जेक्ट्स के रूपांतरण पर ले जाता है, और इसके विपरीत।

प्रारंभिक तर्क


प्रत्येक क्षेत्र निम्नलिखित आरंभीकरण तर्क देता है:


मेटाडाटा


प्रत्येक तालिका के लिए, आप class Meta में एक समान मेटाडेटा लिख ​​सकते हैं:

विकल्पविवरणविरासत में मिला है?
databaseमॉडल डेटाबेसहां
db_tableतालिका का नाम जिसमें डेटा संग्रहीत किया जाएगानहीं
indexesसूचकांक के लिए खेतों की सूचीहां
order_byडिफ़ॉल्ट रूप से सॉर्ट करने के लिए फ़ील्ड की सूचीहां
primary_keyसमग्र प्राथमिक कुंजी, समग्र श्रेणी का एक उदाहरण, उदाहरणहां
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     


स्पष्ट रूप से सहेजे बिना (मॉडल पद्धति) का उपयोग करके सीधे रिकॉर्ड बनाया जा सकता है।

 >>> 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 इंस्टेंसेस (जंग में QuerySet का एनालॉग) लौटाते हैं।

एक भी रिकॉर्ड हासिल किया


एकल रिकॉर्ड प्राप्त करने के लिए, SelectQuery.get() विधि का उपयोग करें:

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


क्वेरी को सीधे तर्क में बदलकर छोटा किया जा सकता है get() :

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


एक से अधिक रिकॉर्ड प्राप्त करना


आइए Person चक्र के सभी उदाहरणों के बारे में Person :

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


आइए व्यक्तिगत उदाहरणों और उनसे जुड़ी सभी प्रविष्टियों के माध्यम से चलते हैं:

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


एक ही चयन को दूसरे तरीके से निकाला जा सकता है - बॉब को अनुरोध के साथ स्पष्ट रूप से पास करना:

 >>> 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 or Person.birthday > d1960) , लेकिन ऐसा नहीं करना बेहतर है, क्योंकि peewee हमेशा ऐसे रिकॉर्ड को सही ढंग से हैंडल नहीं करता है।


और अब तोराबान। 1940 और 1960 के बीच जन्म लेने वालों को चुनें:

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


और एक आखिरी बात। हम 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 से अधिक तेज़ रहा है, और उसी के बारे में जब मॉडल प्रदर्शन को पुनरावृत्ति और वापस कर रहा है।

मेरे कंप्यूटर पर, peewee ने अधिकांश कार्यों पर Django और SQLAlchemy को बेहतर बनाया, और पुनरावृत्तियों और नमूना उदाहरणों पर तुलनीय परिणाम दिखाए।


फिर उन्होंने गीथब पर बेंचमार्क के परिणाम प्रकाशित किए। हमने विभिन्न परिदृश्यों में फॉरेनके के माध्यम से सामान्य मॉडल और संबंधित का परीक्षण किया। बहुत उत्सुक है

कौन परवाह करता है, स्रोत:


कीमिया के लिए एक अच्छा विकल्प, आपको क्या लगता है?

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


All Articles