
मेरा सुझाव है कि सभी 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
सभी अवसरों के लिए , कई प्रकार के क्षेत्र हैं। Peewee डेटाबेस के लिए उपयुक्त मानों के लिए पायथन ऑब्जेक्ट्स के रूपांतरण पर ले जाता है, और इसके विपरीत।
प्रारंभिक तर्क
प्रत्येक क्षेत्र निम्नलिखित आरंभीकरण तर्क देता है:
null=False
- क्या null values स्टोर करना संभव है;index=False
- डेटाबेस में दिए गए कॉलम के लिए एक इंडेक्स बनाना है या नहीं;unique=False
- डेटाबेस में इस कॉलम के लिए एक अद्वितीय सूचकांक बनाना है या नहीं। संयुक्त सूचकांकों पर भी अध्याय देखें;verbose_name=None
- एक क्षेत्र के मानव-पठनीय प्रतिनिधित्व के लिए एक स्ट्रिंग;help_text=None
- फ़ील्ड के लिए सहायक पाठ के साथ एक पंक्ति;db_column=None
- एक स्ट्रिंग जो स्पष्ट रूप से इस क्षेत्र के लिए डेटाबेस में कॉलम का नाम सेट करती है, उदाहरण के लिए जब लीगेसी डेटाबेस के साथ काम किया जाता है;default=None
- तात्कालिकता पर वर्ग क्षेत्रों के लिए default=None
मान;choices=None
- दो-तत्व टुपल्स की एक सूची या टपल, जहां पहला तत्व आधार के लिए मूल्य है, दूसरा प्रदर्शित मूल्य (जैंग के समान) है;primary_key=False
- इस क्षेत्र को प्राथमिक कुंजी के रूप में उपयोग करना है या नहीं;sequence=None
- फ़ील्ड भरने के लिए अनुक्रम (सुनिश्चित करें कि बैकएंड इस कार्यक्षमता का समर्थन करता है);
मेटाडाटा
प्रत्येक तालिका के लिए, आप
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
मॉडल का वर्णन किया गया है, यह डेटाबेस में उनके लिए उपयुक्त टेबल बनाने के लिए बना हुआ है:
>>> 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()
स्पष्ट रूप से सहेजे बिना (मॉडल पद्धति) का उपयोग करके सीधे रिकॉर्ड बनाया जा सकता है।
>>> 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()
अब हम कुछ जीवित प्राणी पैदा करेंगे। दादी को बिल्लियों से एलर्जी है, लेकिन हथियारों के कोट में
कुछ समस्याएं हैं :
>>> 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।
अंकल बॉब ने फैसला किया कि आर्म्स के कोट में बहुत सारे जानवर थे और उनमें से फ़िदो को निचोड़ दिया:
>>> 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().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.
चयन के लिए, विधियों का भी उपयोग करें:
SelectQuery.group_by()
SelectQuery.having()
SelectQuery.limit()
और SelectQuery.offset()
यदि आपको यह छोटा ट्यूटोरियल पसंद आया, तो
आधिकारिक दस्तावेज का दौरा करना सुनिश्चित करें - इसमें बहुत सारी दिलचस्प चीजें हैं, जिसमें
सामान्य समस्याओं के समाधान के साथ व्यंजनों और बुनियादी कार्यक्षमता का विस्तार
करने वाले प्लगइन्स का एक
सेट शामिल है ।
बोनस
उनके ब्लॉग पर लेखकों से ORM की गति के बारे में पूछा गया था, जिस पर उन्होंने उत्तर दिया:
मेरी मशीन पर Peewee अधिकांश कार्यों में Django और SQA से अधिक तेज़ रहा है, और उसी के बारे में जब मॉडल प्रदर्शन को पुनरावृत्ति और वापस कर रहा है।
मेरे कंप्यूटर पर, peewee ने अधिकांश कार्यों पर Django और SQLAlchemy को बेहतर बनाया, और पुनरावृत्तियों और नमूना उदाहरणों पर तुलनीय परिणाम दिखाए।
फिर उन्होंने गीथब पर बेंचमार्क के परिणाम प्रकाशित किए। हमने विभिन्न परिदृश्यों में फॉरेनके के माध्यम से सामान्य मॉडल और संबंधित का परीक्षण किया। बहुत
उत्सुक है ।
कौन परवाह करता है, स्रोत:
कीमिया के लिए एक अच्छा विकल्प, आपको क्या लगता है?