Programming Freaks  | دورات ومقالات برمجيه

Please login or register.

Login with username, password and session length
Advanced search  

News:

Please Read our FAQ

Author Topic: PySQLite  (Read 1282 times)

Striky

  • Helping Freak
  • Administrator
  • Posting Freak
  • *****
  • Posts: 283
    • View Profile
    • Weblog
    • Email
PySQLite
« on: October 26, 2008, 04:24:18 AM »

ماهى PySQLite؟
هى interface ل SQLite من خلال ال Python

للتحميل اضغط هنا

للتستيب مثل اى Lib
python setup.py install

لنبدأ
1- هنحتاج نعمل import لل module
PySQLite هتعملها import ك pysqlite2 ولكن ال lib دى بردو اللى يهمنا فيها هو sub-module بإسم dbapi2


Writing

2- هنحتاج نعمل Connection مع DB تمام ؟ ال db نفسها عبارة عن file عادى جدا -فى حال عدم وجوده هيتم إنشاء file جديد- فلعمل ال Connection هنحتاج نستخدم ال connect method الموجودة بال dbapi2


Code: ($2) [Select]
Code: ($2) [Select]
#!bin/python 

from pysqlite2 import dbapi2 as SQLite

نعمل connect ال connect ميثود بتنشئ file فى حال عدم وجوده وإذا موجود هيتعمل return بيه
Code: ($2) [Select]
dbConnection=SQLite.connect("mydb.sqlite") 

كدا انشأنا ال connection بنجاح

ملحوظة: تقدر تعمل Quick Access DB على ال Memory
Code: ($2) [Select]
memConnection=SQLite.connect(“:memory:”) 

بعد ماأنشأنا ال Connection محتاجين نعمل Cursor عشان نستخدمه فى التعامل مع ال DB
Code: ($2) [Select]
cursor=dbConnection.cursor() #gets a cursor object.. 

عايزين ننشئ Table وليكن بإسم Info ويشمل 3 Fields مثلا
id: integer, primary Key
name: varchar(50)
phone: varchar(10)
جميل يبقة هنحتاج SQL Statement
Code: ($2) [Select]
sqlStmt='CREATE TABLE info (id INTEGER PRIMARY KEY, name VARCHAR(50), phone VARCHAR(10))' 

ولتنفيذ ال SQL Statement نستخدم ال execute method الخاصة بال cursor object

Code: ($2) [Select]
>>> cursor.execute(sqlStmt) 
<pysqlite2.dbapi2.Cursor object at 0x0128B230 >


ندخل بعض ال داتا

Code: ($2) [Select]
>>> cursor.execute('INSERT INTO info VALUES(null, "ahmed youssef", "12345678")') 
<pysqlite2.dbapi2.Cursor object at 0x0128B230>

>>> cursor.execute('INSERT INTO info VALUES(null, "3amer mohamed", "41234114")')
<pysqlite2.dbapi2.Cursor object at 0x0128B230>

نقدر ندخل الfields كالتالى ..
Code: ($2) [Select]
>>> username="guru" 
>>> phone   ="36987452"

كل اللى عليك تباصى علامة إستفهام وفى ال 2nd argument تخليها tuple مكونة من ال vars اللى عايز تدخلها ..
Code: ($2) [Select]
>>> cursor.execute('INSERT INTO info VALUES(null, ?, ?)', (username, phone)) #replaced... 
<pysqlite2.dbapi2.Cursor object at 0x0128B230>

بعد ماعدلنا او اضفنا لازم نستدعى ال Commit method لحفظ التعديلات دى ..
Code: ($2) [Select]
>>> dbConnection.commit() 

ملحوظة: إذا حبيت تخلى التعديلات يتم تنفيذها اوتوماتيك
ضيف فى ال connect ميثود الخاصة بإنشاء الconnection التالى
Code: ($2) [Select]
autocommit=1 


فى حالة قيامك بتعديل ما وحبيت ترجع فيه بنستخدم ال rollback method

بعد إنتهائك اقفل الcursor, connection
Code: ($2) [Select]
cursor.close() 
dbConnection.close();


ال Reading
كالعادة لازم نعمل connect على db وننشئ ال connection
ونعمل cursor object بإستخدم cursor ميثود الموجودة بال connection object
ننفذ بعض ال sql statements ولكن هنا هنخليها عبارة عن إستعلامات بسيطة

ننشئ الconnection
Code: ($2) [Select]
>>> dbConnection=SQLite.connect("mydb.sqlite") #reopen the db.. 

ننشئ cursor
Code: ($2) [Select]
>>> cursor=dbConnection.cursor() 
>>> #let's query the db..

sql statement ليتم تنفيذها
Code: ($2) [Select]
>>> sqlStmt='SELECT * from info' 


تنفيذ ال sqlStmt
Code: ($2) [Select]
>>> cursor.execute(sqlStmt) 

fetchall هى ميثود بتعيد كل الrows على صورة tuples ف list
Code: ($2) [Select]
>>> cursor.fetchall() 
[(1, u'ahmed youssef', u'12345678'), (2, u'3amer mohamed', u'41234114'), (3, u'guru', u'36987452')]

او تقدر تعمل شئ مشابه لكدا بإنك ت iterate على كل الrows اللى موجودة بال result
Code: ($2) [Select]
>>> for row in cursor: 
        #id, name, phone
        print "----------"
        print "ID: ", row[0]
        print "Name: ", row[1]
        print "Phone: ", row[2]

       
----------
ID:  1
Name:  ahmed youssef
Phone:  12345678
----------
ID:  2
Name:  3amer mohamed
Phone:  41234114
----------
ID:  3
Name:  guru
Phone:  36987452

لاحظ إنك تقدر تتعامل معاها ب .next لأنها iterator
Code: ($2) [Select]
>>> cursor.next() 
(1, u'ahmed youssef', u'12345678')
>>> cursor.next()
(2, u'3amer mohamed', u'41234114')

fetchmany(num)
بتعيد num معين من ال rows
Code: ($2) [Select]
>>> ret=cursor.fetchmany(2) 
>>> ret
[(1, u'ahmed youssef', u'12345678'), (2, u'3amer mohamed', u'41234114')]

fetchone()
بتعيد row واحد


Code: ($2) [Select]
>>> one=cursor.fetchone() 
>>> one
(3, u'guru', u'36987452')
جميل جدا .. طب وإذا حبيت اخزن user defined type ؟
بكل بساطة اعمل ال class بتاعك الأول
Code: ($2) [Select]
class Person(object): 

    def __init__(self, name, phone):
        self.name=name
        self.phone=phone

ننشئ connection و cursor ولكن ننبه ال database انها تعمل parse لل declared types زى ال Person مثلا .. هنغير شوية ونتعامل مع ال memory
Code: ($2) [Select]
#create a connection. 
memConnection=SQLite.connect(':memory:', detect_types=SQLite.PARSE_DECLTYPES)

#cursor
cursor=memConnection.cursor()

الوقتى ننشئ table بحيث إنه ياخد 2 fields وهم ال ID, information
Code: ($2) [Select]
cursor.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, p person)") 

جميل جدا .. ناقص إننا نحدد إزاى ال object بتاعنا يتحول ل string وازاى نجمع ال data بتاعته تانى من ال string دا
ملحوظة: إحنا بنتكلم على مجرد text بإستخدم toString method مثلا ..مش serializing objects او Pickling
Code: ($2) [Select]
def adaptPerson(person): 
    return "%s;%s" %(person.name, person.phone)

وكيفية التجميع .. بكل بساطة إحنا حولنا ال fields بتاعت ال Person object ل string ودمجناهم ب ;.. يبقة نقدر نجمعهم بإننا نفصل ال ; ونباصى ال قيم الخاصة بال fields دى لل Constructor وننشئ object منها
Code: ($2) [Select]
def convToPerson(text): 
    name, phone=map(str, text.split(";"))
    return Person(name, phone)


بعد ماعملنا الميثودز الخاصة بالتحويل والتجميع .. كل اللى ناقص اننا نبلغ SQLite بكدا
Code: ($2) [Select]
SQLite.register_adapter(Person, adaptPerson) 
SQLite.register_converter("person", convToPerson)

ننشئ شوية objects
Code: ($2) [Select]
p1=Person("ahmed", "12345678") 
p2=Person("rul3z", "89745632")

ونضيفهم لل Table
 
Code: ($2) [Select]
cursor.execute('INSERT INTO test VALUES(null, ?)', (p1, )) 
cursor.execute('INSERT INTO test VALUES(null, ?)', (p2, ))

نجرب نستعلم عن الموجودين
Code: ($2) [Select]
#select.. 
cursor.execute('SELECT * from test')
for row in cursor:
    print row

#output:
(1, (ahmed;12345678))
(2, (rul3z;89745632))

نقفل ال cursor, connection
Code: ($2) [Select]
#clean-up 
cursor.close()
memConnection.close()

الكود النهائى
Code: ($2) [Select]
#!bin/python 

from pysqlite2 import dbapi2 as SQLite


#dbName='myobjDBTest.sqlite'
#create a connection.
#dbConnection=SQLite.connect(dbName, detect_types=SQLite.PARSE_DECLTYPES)
memConnection=SQLite.connect(':memory:', detect_types=SQLite.PARSE_DECLTYPES)
#cursor
cursor=memConnection.cursor()


class Person(object):

    def __init__(self, name, phone):
        self.name=name
        self.phone=phone

    def __repr__(self):
        return "(%s;%s)" %(self.name, self.phone)

#define a method to register it..

def adaptPerson(person):
    return "%s;%s" %(person.name, person.phone)
 
def convToPerson(text):
    name, phone=map(str, text.split(";"))
    return Person(name, phone)

SQLite.register_adapter(Person, adaptPerson)
SQLite.register_converter("person", convToPerson)

p1=Person("ahmed", "12345678")
p2=Person("rul3z", "89745632")


#create a test table..
cursor.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, p person)")

#add
cursor.execute('INSERT INTO test VALUES(null, ?)', (p1, ))
cursor.execute('INSERT INTO test VALUES(null, ?)', (p2, ))

#select..
cursor.execute('SELECT * from test')
for row in cursor:
    print row

#clean-up
cursor.close()
memConnection.close()


وللمزيد راجع التالى :

http://www.devshed.com/c/a/Python/Us...ite-in-Python/
http://www.initd.org/tracker/pysqlite/wiki/basicintro
http://www.initd.org/pub/software/py...ined-functions

« Last Edit: October 26, 2008, 05:40:17 AM by Ahmed Youssef »
Logged

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