مامعنى ORM ؟ هى اختصار ل Object Relational Mapping حيث تقوم بتمثيل بياناتك على هيئة objects من classes بدلا من صفوف من جداول
فبإختصار الclass بيعبر عن بنية الجدول وال object بيعبر عن كل صف فى الجدول
تستطيع ايضا من خلال ال ORMs ادارة العلاقات بين الجداول وبعضها يتيح الوراثة!!
Storm
هنبدأ ب storm وهى ORM مقدم من canonical
اولا بعض الأساسيات
>>> from storm.locals import *
ننشئ صف ليمثل لنا جدول للكتب
>>> class Book(object):
... __storm_table__="book"
... id=Int(primary=True)
... name=Unicode()
... npages=Int()
ننشئ قاعدة بيانات
>>> db=create_database("sqlite:")
ننشئ كائن مخزن (ليتعامل مع عناصر قاعدة البيانات)
ننشئ الجدول المعبر عن الكتب
>>> store.execute("CREATE TABLE book (id INTEGER PRIMARY KEY, name VARCHAR, npages INTEGER)")
ننشئ كائن
>>> rbook.name=u"Introduction to Ruby"
>>> rbook.npages=210
>>> print rbook.id, rbook.name, rbook.npages
None Introduction to Ruby 210
فلنضيفه الآن
>>> store.add(rbook)
<__main__.Book object at 0xb78aecac>
>>> print rbook.id, rbook.name, rbook.npages
None Introduction to Ruby 210
>>>
>>> pybook.name=u"PyGuide"
>>> pybook.npages=230
>>> print pybook
<__main__.Book object at 0xb78ae80c>
>>> store.add(pybook)
<__main__.Book object at 0xb78ae80c>
الحصول على سجل ما
>>> pythonbook=store.find(Book, Book.name==u"PyGuide").one()
>>> pythonbook.name
u'PyGuide'
الطريقة one تحصل على صف واحد
او ربما البحث بال primary key الخاص به
>>> store.get(Book, 1).name
u'Introduction to Ruby'
الطريقة flush كالعادة لعمل flush
>>> store.flush()
>>> store.get(Book, 1).id
1
>>> pythonbook=store.find(Book, Book.name==u"PyGuide").one()
>>> pythonbook.id
2
الطريقة commit تستخدم لتحقيق اى تعديل على اى كائن
التعامل مع الكائنات افضل كثيرا من جمل SQL المملة وتساعد على تجنب الكوارث وتسهل امكانية النقل من قاعدة بيانات لأخرى بكل سهولة
للمزيد تابع
https://storm.canonical.com/SQLObject
ايضا مثال رائع لل ORMs هو SQLObject مشابه ل storm
1- استدعاء المكونات ل sqlobject
>>> from sqlobject import *
>>>
2- انشاء Hub ليعالج الإتصال القادم من العنوان sqlite:/:memory: وهى مسار قاعدة بيانات sqlite مخزنة فى الذاكرة
>>> sqlhub.processConnection=connectionForURI('sqlite:/:memory:')
>>>
3- نكتب صف يعبر عن الجدول
>>> class Book(SQLObject):
... title=StringCol()
... npages=IntCol()
4- ننشئ الجدول
5- ننشئ كائنات من الصف Book
>>> rbbook=Book(title="Introduction to Ruby", npages=230)
>>> rbbook.title
'Introduction to Ruby'
>>> rbbook.npages
230
>>> rbbook
<Book 1 title="'Introduction to ...'" npages=230>
>>> pybook="PyGuide"
>>> pybook=Book(title="PyGuide, npages=330")
>>> pybook=Book(title="PyGuide", npages=330)
>>> pybook
<Book 2 title='PyGuide' npages=330>
للحصول على كتاب ما بإستخدام ال id استخدم الطريقة get
>>> Book.get(1)
<Book 1 title="'Introduction to ...'" npages=230>
>>> book=Book.get(2)
>>> book
<Book 2 title='PyGuide' npages=330>
للإستعلام استخدم الطريقة select
>>> books=Book.select()
>>> list(books)
[<Book 1 title="'Introduction to ...'" npages=230>, <Book 2 title='PyGuide' npages=330>]
هنا حصلنا على جميع الكائنات من الصف Book
>>> rbbooks=Book.select(Book.q.title=="Introduction to Ruby")
>>> list(rbbooks)
[<Book 1 title="'Introduction to ...'" npages=230>]
هناك selectBy ايضا بديلة ل select تابع المثال التالى للحصول على كائنات الكتب اللتى عدد صفحاتها 230
>>> pybook
<Book 2 title='PyGuide' npages=330>
>>> pybook.npages=230
>>> pages230=Book.selectBy(npages=230)
>>> list(pages230)
[<Book 1 title="'Introduction to ...'" npages=230>, <Book 2 title='PyGuide' npages=230>]
للمزيد تابع
http://www.sqlobject.org/