Author Topic: ORM  (Read 667 times)

Ahmed Youssef

  • Helping Freak
  • Administrator
  • Active Member
  • *****
  • Posts: 242
    • View Profile
    • WWW
    • Email
ORM
« on: December 21, 2008, 01:12:29 AM »



مامعنى ORM ؟ هى اختصار ل Object Relational Mapping حيث تقوم بتمثيل بياناتك على هيئة objects من classes بدلا من صفوف من جداول
فبإختصار الclass بيعبر عن بنية الجدول وال object بيعبر عن كل صف فى الجدول
تستطيع ايضا من خلال ال ORMs ادارة العلاقات بين الجداول وبعضها يتيح الوراثة!!

Storm
هنبدأ ب storm وهى ORM مقدم من canonical

اولا بعض الأساسيات
Code: [Select]
>>> from storm.locals import *



ننشئ صف ليمثل لنا جدول للكتب
Code: [Select]
>>> class Book(object):

...     __storm_table__="book"

...     id=Int(primary=True)

...     name=Unicode()

...     npages=Int()

ننشئ قاعدة بيانات
Code: [Select]
>>> db=create_database("sqlite:")


ننشئ كائن مخزن (ليتعامل مع عناصر قاعدة البيانات)
Code: [Select]
>>> store=Store(db)


ننشئ الجدول المعبر عن الكتب
Code: [Select]
>>> store.execute("CREATE TABLE book (id INTEGER PRIMARY KEY, name VARCHAR, npages INTEGER)")


ننشئ كائن
Code: [Select]
>>> rbook.name=u"Introduction to Ruby"

>>> rbook.npages=210

>>> print rbook.id, rbook.name, rbook.npages

None Introduction to Ruby 210


فلنضيفه الآن
Code: [Select]
>>> 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>


الحصول على سجل ما
Code: [Select]
>>> pythonbook=store.find(Book, Book.name==u"PyGuide").one()

>>> pythonbook.name

u'PyGuide'

الطريقة one تحصل على صف واحد

او ربما البحث بال primary key الخاص به
Code: [Select]
>>> store.get(Book, 1).name

u'Introduction to Ruby'

الطريقة flush كالعادة لعمل flush
Code: [Select]
>>> 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
Code: [Select]
>>> from sqlobject import *

>>>


2- انشاء Hub ليعالج الإتصال القادم من العنوان sqlite:/:memory: وهى مسار قاعدة بيانات sqlite مخزنة فى الذاكرة
Code: [Select]
>>> sqlhub.processConnection=connectionForURI('sqlite:/:memory:')

>>>



3- نكتب صف يعبر عن الجدول
Code: [Select]
>>> class Book(SQLObject):

...     title=StringCol()

...     npages=IntCol()


4- ننشئ الجدول
Code: [Select]
>>> Book.createTable()

[]



5- ننشئ كائنات من الصف Book
Code: [Select]
>>> 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
Code: [Select]
>>> Book.get(1)

<Book 1 title="'Introduction to ...'" npages=230>

>>> book=Book.get(2)

>>> book

<Book 2 title='PyGuide' npages=330>


للإستعلام استخدم الطريقة select
Code: [Select]
>>> books=Book.select()

>>> list(books)

[<Book 1 title="'Introduction to ...'" npages=230>, <Book 2 title='PyGuide' npages=330>]

هنا حصلنا على جميع الكائنات من الصف Book

Code: [Select]
>>> rbbooks=Book.select(Book.q.title=="Introduction to Ruby")

>>> list(rbbooks)

[<Book 1 title="'Introduction to ...'" npages=230>]


هناك selectBy ايضا بديلة ل select تابع المثال التالى للحصول على كائنات الكتب اللتى عدد صفحاتها 230
>>> pybook
Code: [Select]
<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/


Logged

Life is just a chance to grow a soul. - A. Powell
Weblog: http://ahmedyoussef.wordpress.com/