الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Pysqlite

بدأه ahmed_youssef في 11 يونيو 2008 · 8 رد · 2,977 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ماهى 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

#!bin/python

from pysqlite2 import dbapi2 as SQLite

نعمل connect ال connect ميثود بتنشئ file فى حال عدم وجوده وإذا موجود هيتعمل return بيه

dbConnection=SQLite.connect("mydb.sqlite")

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

ملحوظة: تقدر تعمل Quick Access DB على ال Memory

memConnection=SQLite.connect(“:memory:”)

بعد ماأنشأنا ال Connection محتاجين نعمل Cursor عشان نستخدمه فى التعامل مع ال DB

cursor=dbConnection.cursor() #gets a cursor object..
عايزين ننشئ Table وليكن بإسم Info ويشمل 3 Fields مثلا 
id: integer, primary Key
name: varchar(50) 
phone: varchar(10)

جميل يبقة هنحتاج SQL Statement

sqlStmt='CREATE TABLE info (id INTEGER PRIMARY KEY, name VARCHAR(50), phone VARCHAR(10

))'

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

>>> cursor.execute(sqlStmt)
<pysqlite2.dbapi2.Cursor object at 0x0128B230

>

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

>>> 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 كالتالى ..

>>> username="guru"
>>> phone   ="36987452"

كل اللى عليك تباصى علامة إستفهام وفى ال 2nd argument تخليها tuple مكونة من ال vars اللى عايز تدخلها ..

>>> cursor.execute('INSERT INTO info VALUES(null, ?, ?)', (username, phone)) #replaced...
<pysqlite2.dbapi2.Cursor object at 0x0128B230>

بعد ماعدلنا او اضفنا لازم نستدعى ال Commit method لحفظ التعديلات دى ..

>>> dbConnection.commit()

ملحوظة: إذا حبيت تخلى التعديلات يتم تنفيذها اوتوماتيك

ضيف فى ال connect ميثود الخاصة بإنشاء الconnection التالى

autocommit=1

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

بعد إنتهائك اقفل الcursor, connection

cursor.close()
dbConnection.close();

ال Reading

كالعادة لازم نعمل connect على db وننشئ ال connection

ونعمل cursor object بإستخدم cursor ميثود الموجودة بال connection object

ننفذ بعض ال sql statements ولكن هنا هنخليها عبارة عن إستعلامات بسيطة

ننشئ الconnection

>>> dbConnection=SQLite.connect("mydb.sqlite") #reopen the db..

ننشئ cursor

>>> cursor=dbConnection.cursor()
>>> #let's query the db..

sql statement ليتم تنفيذها

>>> sqlStmt='SELECT * from info'

تنفيذ ال sqlStmt

>>> cursor.execute(sqlStmt)

fetchall هى ميثود بتعيد كل الrows على صورة tuples ف list

>>> cursor.fetchall()
[(1, u'ahmed youssef', u'12345678'), (2, u'3amer mohamed', u'41234114'), (3, u'guru', u'36987452')]

او تقدر تعمل شئ مشابه لكدا بإنك ت iterate على كل الrows اللى موجودة بال result

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

>>> cursor.next()
(1, u'ahmed youssef', u'12345678')
>>> cursor.next()
(2, u'3amer mohamed', u'41234114')

fetchmany(num)

بتعيد num معين من ال rows

>>> ret=cursor.fetchmany(2)
>>> ret
[(1, u'ahmed youssef', u'12345678'), (2, u'3amer mohamed', u'41234114')]

fetchone()

بتعيد row واحد

>>> one=cursor.fetchone()
>>> one
(3, u'guru', u'36987452')

جميل جدا .. طب وإذا حبيت اخزن user defined type ؟

بكل بساطة اعمل ال class بتاعك الأول

class Person(object):

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

ننشئ connection و cursor ولكن ننبه ال database انها تعمل parse لل declared types زى ال Person مثلا .. هنغير شوية ونتعامل مع ال memory

#create a connection.
memConnection=SQLite.connect(':memory:', detect_types=SQLite.PARSE_DECLTYPES)

[CODE]#cursor
cursor=memConnection.cursor()

الوقتى ننشئ table بحيث إنه ياخد 2 fields وهم ال ID, information

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

جميل جدا .. ناقص إننا نحدد إزاى ال object بتاعنا يتحول ل string وازاى نجمع ال data بتاعته تانى من ال string دا

ملحوظة: إحنا بنتكلم على مجرد text بإستخدم toString method مثلا ..مش serializing objects او Pickling

def adaptPerson(person):
	return "%s;%s" %(person.name, person.phone)

وكيفية التجميع .. بكل بساطة إحنا حولنا ال fields بتاعت ال Person object ل string ودمجناهم ب ;.. يبقة نقدر نجمعهم بإننا نفصل ال ; ونباصى ال قيم الخاصة بال fields دى لل Constructor وننشئ object منها

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

بعد ماعملنا الميثودز الخاصة بالتحويل والتجميع .. كل اللى ناقص اننا نبلغ SQLite بكدا

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

ننشئ شوية objects

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

ونضيفهم لل Table

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

اقتباس
#output:

(1, (ahmed;12345678))

(2, (rul3z;89745632))

نقفل ال cursor, connection

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

الكود النهائى

#!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()

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

إضافة

اصبحت sqlite3 جزء من ال stdlib الخاصة بالبيثون

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#2

ممتاز ... وبصراحة استخدمت ال sqlite ولكن مصادر تعليمها قليلة (لم أجد سوى كتاب واحد) وأدواتها قليلة أيضاً ... لكن أظن أنها ستتطور فكل تطبيق صغير او متوسط يجب أن يستخدمها نظراً لصغر حجمها (أقل من ربع ميغا !!!) وهي أفضل بكثير من الأكسس الذي يبلغ حجم محركه حوالي 20 ميغا !!

تطبيق Amaraok يستخدمها

شكراً أخي الكريم على المقال الرائع

تم تعديل هذه المشاركة بواسطة خالد_الحوراني في 11 يونيو 2008 في 16:54

#3

ال SQLite من اهم ميزاتها انها serverless وselfcontained فتقدر تستخدمها ك backend لشغلك بدون اى قلق من ناحية الإعتماديات + بقت بتيجى مدمجة مع لغات كتير والديفولت لفريموركات كتير بردو

بعض مستخدمىSQLite

http://www.sqlite.org/mostdeployed.html

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#4

شكراً للرابط ... أخي الكريم هل استخدمتها مع البايثون ؟؟ ماهو وصف البرنامج الذي استخدمتها فيه (إذا لم يكن السؤال مزعجاً) ؟؟

استخدمتها مع فريم وورك CakePHP وبصراحة متازة وفي أداة لمشاهدة الجداول وتحريرهم ببيئة رسومية اسمها (الأداة تجارية يعني معك 30 يوم لتجريبها)

sqlite maestro

تم تعديل هذه المشاركة بواسطة خالد_الحوراني في 11 يونيو 2008 في 16:59

#5

استخدمت SQLite ك backend فى كذا برنامج زى File Dups مثلا لكن حاليا انا مرتبط بالويب ابليكيشنز ومفهوم ال ActiveRecord/ORMs عن نوع معين من قواعد البيانات

بالنسبة لل PHP انا استخدمتها مع CodeIgniter واكتر من ممتازة

بالمناسبة بخصوص ال sqlite maestro فإن شاء الله فى مشروع قريب بديل مجانى ليها مكتوب بالبيثون

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#6

ماشاء الله وبالمناسبة حلو اسم البرنامج ...

الظاهر الأخ حريف بايثون ... إذا كان في عندك استعداد لطرح مواضيع عن البايثون في المنتدى فراسل الأخ HGB لفتح منتدى فرعي لها ... ما رأيك؟

وننتظر بديل المايسترو

#7

بما انك تبع PHP ففى تول موجودة زى PHPMyAdmin بإسم SQLiteManager

وتول البايثون ان شاء الله هبدأ فيها بعد امتحاناتى مباشرة

بالنسبة للقسم فالسه مش فى مواضيع كافية (بالنسبة لى دى مش مشكلة :D )

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#8

السلام عليكم و رحمة الله

جزاكم الله أخي الكريم على الموضوع القيم

بالنسبة لأدوات التعامل مع sqlite فهناك أداتين:

1- إضافة لمتصفح الفايرفوكس

http://code.google.com/p/sqlite-manager/

https://addons.mozilla.org/en-US/firefox/addon/5817

2- SQLite expert ... personal

http://www.sqliteexpert.com/download.html

سبحانك اللهم و بحمدك ، أشهد أن لا إله إلا أنت ، أستغفرك ربي و أتوب إليك

مدونتي

http://www.facebook.com/brmjt

#9

شكرا لك.. انا شغال على الكور بحيث انه يكون مناسب لأكتر من انجن بإستخدام SQLAlchemy

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

مواضيع مشابهة