آموزش پای کیوت ( اغاز کار با پایگاه داده)

با درود . برای این بخش از آموزش تصمیم گرفتم تا اصول کار با پایگاه داده و همچنین جدول های پایگاه داده رو  آمورش بدم. خب قبل از همه همه چیز باید اول جدذول های مورد نیاز پایگاه دادمون را مشخص کنیم بعد از طراحی پایگاه داده شروع به ساخت تک تک بخش های برنامه می کنیم و در اخر تمام قطعات ساخته شده رو سرهم می کنیم تا برنامه یکپارچه بشه. خب جدول های پایگاه داده ی ما حاوی اطلاعات زیر هستن:

جدول stuff که شامل id ,name, price,tip

جدول buyer که شامل id, name,tel,address,descript

جدول orders که شاملid,stuffid,stuff,number,price,date,factornumber,buyer_code

جدول orderNow که شامل stuffId ,stuff,number,pricestuff,totalstuff

 

جدول stuff شامل ای دی کالا ، نام و قیمت و توضیحی درباره ان است.

جدول buyer که مشخصات خریدار از قبیل نام و ادرس و تلفن رو نگه داری می کند

جدول orders که کالای خریداری شده رو با ذکر تعداد اون کالا و قیمتشون و تاریخ خرید و شماره ای دی خریدار اون و همچنین شماره فاکتوری که کالا در اون قرار دارد را نگه داری می کند

جدول orderNow که یه چیزی مثل پشته هستش که اطلاعاتی در مورد کالاهای در لیست خرید در هنگام عملیات فروش نگه داری می کند و سپس پاک می شود .

حالا بسراغ اولین بخش از ایجاد برنامه می ریم که همون ایجاد پایگاه داده هستش. کد زیر جدولی با نام db.sqlite در پایگاه داده ای از نوع sqlite ایجاد می کند و تمامی جدول های توضیح داده شده در بالا را یک به یک می سازد. سورس زیر را در فایلی بنام sql.py ذخیره می کنیم .

from PyQt4 import QtSql, QtGui , QtCore

def createConnection():
    db =QtSql.QSqlDatabase.addDatabase('QSQLITE')
    db.setDatabaseName('db.sqlite')
    if not db.open():
        QtGui.QMessageBox.critical(None,'Cannot open database',
                "Unable to establish a database connection.\n"
                              "This example needs SQLite support. Please read "
                              "the Qt SQL driver documentation for information "
                              "how to build it.\n\n"
                              "Click Cancel to exit.",
                QtGui.QMessageBox.Cancel)
        return False
    query = QtSql.QSqlQuery()
    QtGui.QApplication.processEvents()
    query.exec_('''CREATE TABLE  company(
id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
name TEXT NOT NULL ,
address TEXTNOT NULL,
tel TEXT,
descript TEXT)''')
    query.exec_('''CREATE TABLE  users(
id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
username TEXT UNIQUE ,
pass TEXT,
email TEXT,
sq TEXT,
answer TEXT
)''')
    query.exec_('''
CREATE TABLE  stuff(
id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
name NVARCHAR(100) NOT NULL,
price INTEGER ,
tip TEXT)''')

    query.exec_('''CREATE TABLE  buyer(
id INTEGER PRIMARY KEY AUTOINCREMENT ,
name VARCHAR,
tel VARCHAR,
address TEXT,
descript TEXT)''')

    query.exec_('''CREATE TABLE  orders(
id INTEGER PRIMARY KEY AUTOINCREMENT ,
STUFFID INTEGER,
stuff INTEGER,
number INTEGER,
price INTEGER,
date DATE,
factorNumber INTEGER  NOT NULL,
buyer_code INTEGER,
FOREIGN KEY (buyer_code) REFERENCES buyer(id) )''')

    query.exec_('''CREATE TABLE  orderNow(
STUFFID INTEGER,
stuff INTEGER,
number INTEGER,
priceStuff INTEGER,
totalPrice INTEGER)''')
    return True

حالا نوبت به طراحی اولین بخش از برنامه می رسه. چون از اینجا به بعد باید با جدولها کار کنیم نیاز هستش که من اصول نمایش و کارجدول هارو قبل از شروع شرح بدم. برای نمایش یک جدول از پایگاه داده که اینجا جدول stuff یا کالا رو مثال می زنم باید ابتدا یک model   از این جدول بسازیم و پس از اون  این مدل رو در  یک ویدجت نمایش مثل Table View   یا Tree view قرار بدیم تا اطلاعات نمایش داده بشن. برای حذف یا اضافه کردن اطلاعات به جدول باید تغیرات رو بروی model اعمال کنیم


من دیگه لای اوت گذاری برنامه رو توضیح نمی دم فرض می کنم که باش اشنا هستین ( برای اشنایی با لای اوت های مختلف مثال های همراه پای کیوت بسیار عالی هستن) . ابتدا باید ماژول sql.py که در بالا توضیح داده شد  در اغاز پروژه بصورت import sql  وارد کنیم:

import sys
from PyQt4 import QtGui ,QtCore,QtSql
from PyQt4.QtCore import Qt
import sql

در اخر پروژه نیز تابع createConnection  از ماژول sql  رو برای ساخت پایگاه داده فرا خوانی کنیم با این کار قبل از احجرا شدن اپلیکشن اتصال با پایگاه داده بر قرار می شه:

 if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv);
    if not sql.createConnection():
        sys.exit(1)
    box = storeWindow()
    box.move(30,30);
    box.resize(500,500)
    box.show()
    app.exec_()

پس از اتصال به پایگاه داده نوبت ایجاد مدل و معرفی کردن جدول پایگاه داده مورد نظر به  اون می باشد . در اینجا جدول کالاها یا همون stuff  برای حذف و اضافه کردن کالاها به اون مد نظر است:

        self.model = QtSql.QSqlTableModel()
        self.model.setTable('stuff')
        self.model.setEditStrategy(
            QtSql.QSqlTableModel.OnManualSubmit)
        self.model.select()

        self.model.setHeaderData(0, QtCore.Qt.Horizontal, "Code")
        self.model.setHeaderData(1, QtCore.Qt.Horizontal, "Stuff")
        self.model.setHeaderData(2, QtCore.Qt.Horizontal, "Price")
        self.model.setHeaderData(3, QtCore.Qt.Horizontal, "Tip")

بعد از ایجاد مدل برای نمایش اون باید مدل رو دریک table view  یا treeView قرار بدیم:

        self.view = QtGui.QTableView()
        self.view.setModel(self.model)
        self.view.setSelectionBehavior(
            QtGui.QAbstractItemView.SelectRows)

بعد از این کار تمامی اطلاعات درون جدول کالاها  باید نمایش داده شود. سپس نوبت به ساختن توابع اضافه کردن و حذف از جدول می رسه که بصورت زیر ساخته می شن:

 
    def setData(self):
        query = QtSql.QSqlQuery()

        stuff = self.stuffNameEDit.text()
        price = self.priceEdit.text()
        tip = self.desEdit.text()

        query.exec_(
            'INSERT INTO stuff(name,price,tip) VALUES ("%s",%s,"%s")'%
            (stuff,price,tip))
        self.model.submitAll()

    def deleteData(self):

        selected =self.view.selectionModel().selectedIndexes()
        if QtGui.QMessageBox.question(self, "Stuff Data",
                QtCore.QString("Do you want delete this row"),
                QtGui.QMessageBox.Yes|QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
            return
        for i in range (0,len(selected)):
            self.model.removeRows(selected[i].row(), 1)
        self.model.submitAll()

خب کار تمام شد کد کامل بخش دوم برنامه ما بصورت زیر هستش:

import sys
from PyQt4 import QtGui ,QtCore,QtSql
from PyQt4.QtCore import Qt
import sql

class storeWindow(QtGui.QWidget):
    def __init__(self,parent=None):
        super(storeWindow, self).__init__(parent)

        stuffNameLabel = QtGui.QLabel('Stuff name')
        self.stuffNameEDit = QtGui.QLineEdit()

        priceLabel = QtGui.QLabel('Price')
        self.priceEdit = QtGui.QLineEdit()

        desLabel = QtGui.QLabel('Tip')
        self.desEdit = QtGui.QLineEdit()        
        texttLabel = QtGui.QLabel(
            'Enter stuff information to add your stuff in store:')

        formLayout = QtGui.QFormLayout()
        formLayout.addRow(texttLabel)
        formLayout.addRow(stuffNameLabel,self.stuffNameEDit)
        formLayout.addRow(priceLabel,self.priceEdit)
        formLayout.addRow(desLabel,self.desEdit)

        DeleteB = QtGui.QPushButton('Delete stuff')
        DeleteB.setFixedWidth(90)

        self.model = QtSql.QSqlTableModel()
        self.model.setTable('stuff')
        self.model.setEditStrategy(
            QtSql.QSqlTableModel.OnManualSubmit)
        self.model.select()

        self.model.setHeaderData(0, QtCore.Qt.Horizontal, "Code")
        self.model.setHeaderData(1, QtCore.Qt.Horizontal, "Stuff")
        self.model.setHeaderData(2, QtCore.Qt.Horizontal, "Price")
        self.model.setHeaderData(3, QtCore.Qt.Horizontal, "Tip")

        self.view = QtGui.QTableView()
        self.view.setModel(self.model)
        self.view.setSelectionBehavior(
            QtGui.QAbstractItemView.SelectRows)

        groupBox = QtGui.QGroupBox('Add stuff')

        viewLayout = QtGui.QVBoxLayout()
        viewLayout.addWidget(self.view)
        viewLayout.addWidget(DeleteB)

        AddB = QtGui.QPushButton('Add stuff')
        AddB.setFixedWidth(80)

        AddB.clicked.connect(self.setData)
        DeleteB.clicked.connect(self.deleteData)

        closeB = QtGui.QPushButton('Close')
        closeB.setFixedWidth(55)

        closeB.clicked.connect(self.close)

        buttonBox = QtGui.QDialogButtonBox()
        buttonBox.addButton(AddB, QtGui.QDialogButtonBox.ActionRole)
        buttonBox.addButton(closeB, QtGui.QDialogButtonBox.RejectRole)

        groupBox.setLayout(formLayout)
        self.mainVlayout = QtGui.QVBoxLayout()
        self.mainVlayout.addLayout(viewLayout)
        self.mainVlayout.addWidget(groupBox)
        self.mainVlayout.addWidget(buttonBox)

        self.setLayout(self.mainVlayout)

    def setData(self):
        query = QtSql.QSqlQuery()

        stuff = self.stuffNameEDit.text()
        price = self.priceEdit.text()
        tip = self.desEdit.text()

        query.exec_(
            'INSERT INTO stuff(name,price,tip) VALUES ("%s",%s,"%s")'%
            (stuff,price,tip))
        self.model.submitAll()

    def deleteData(self):

        selected =self.view.selectionModel().selectedIndexes()
        if QtGui.QMessageBox.question(self, "Stuff Data",
                QtCore.QString("Do you want delete this row"),
                QtGui.QMessageBox.Yes|QtGui.QMessageBox.No) == QtGui.QMessageBox.No:
            return
        for i in range (0,len(selected)):
            self.model.removeRows(selected[i].row(), 1)
        self.model.submitAll()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv);
    if not sql.createConnection():
        sys.exit(1)
    box = storeWindow()
    box.move(30,30);
    box.resize(500,500)
    box.show()
    app.exec_()

این کد رو در فایلی بنام store.py در کنار sql.py ذخیر کنین و اجرا کنین ونتیجه رو مشاهده کنین :).

8 دیدگاه برای «آموزش پای کیوت ( اغاز کار با پایگاه داده)»

  1. سلام!این خیلی خوبه!مرسی و تشکر!
    اکه میشه یه ارتباط با دیتا بیسه کامل با mysql برقرار کنید که قابلیته جستوجو ویرایش و اینکه تا مقداری وارد دیتا بیس شد٫بصورت خودکار وارد تیبل هم بشه و نیازی به زدن دکمه یا ریفرش نداشته یاشه!
    و در کل منظورم اینه که بهترین راه برای اینکه اگر درخواستها و کاربرها و دیتاها و ریکوردها زیاد شدmysql نخوابه و کل کار زیر سوال بره!فقط ایرج شرمنده اگه سوالم واضح نیست یا اگه توش جسارته!چون من خیلی برای برنامه نویسی با پایتون و مخصوصا PyQt4 اشتیاق و ذوق دارم دوسته خوبم!خیلی خیلی ممنون و ایشالله یروز ببینمت!

  2. سلام
    مطالبتون خیلی عالی بود، خیلی وقت بود دنبال یه دیتابیس میگشتم که بشه باهاش راحت کار کرد. از اوجایی که به پایتون هم علاقه دارم کلی خوشحال شدم.
    اگه ممکنه مطالب بیشتری برای کار با دیتابیس بذارید، مثلا اینکه چجوری میشه از کوئری های متنوع استفاده کرد.
    خیلی ممنون

  3. سلام
    این آموزشی که شما دادید خیلی خوب بود اما یک مشکلی هست
    اول اینکه QtSQL Driver رایگان نیست
    بعد اینکه با دیتا بیس sqlite نمیتوان بصورت سرور-کلاینت استفاده کرد
    من نیاز دارم دیتابیسم را روی یک سروری قرار دهم بعد با دادن آی پی آن سرور بتوان محتوای دیتابیس را تغیر داد مثلا این گونه
    import MySQLdb

    db = MySQLdb.connect(host=”localhost”, # your host, usually localhost
    user=”john”, # your username
    passwd=”megajonhy”, # your password
    db=”jonhydb”) # name of the data base
    میشه کدی که بالا زده اید را به طور کامل اینگونه تغییر دهید؟
    متشکرم

  4. با سلام و خسته نباشید خدمت آقا ایرج گل!

    من مهندس عمران هستم و دارای فوق لیسانس زلزله. خیلی علاقه دارم برنامه های مرتبط با رشتم رو بنویسم و در اختیار دیگران قرار بدم. نرم افزار محاسبه ضریب زلزله رو نوشتم (توی وبلاگم هست) ، ولی خب خودم هم میدونم که حرفه ای نیست و فقط در حدی هست که کار رو راه بیندازه.
    قصد دارم انشالله یک برنامه دیگه بنویسم که خیلی نیاز به پایگاه داده داره. دارم یاد میگیرم. توی وب خیلی گشتم، ولی آموزشی که شما دادین خیلی عالی بود. اگه امکانش هست براتون حتما ادامه بدین، چون دیدم یکسالی هست که پست جدیدی نداشتین. ممنون

  5. سلام جناب ایرج
    روز به خیر
    امیدوارم همیشه شاد و موفق باشید
    بسیار استفاده کردم از مطالب خوبتون
    چی شده که یکسالی هست دیگه ادامه ندادید؟
    توی کامنت ها که می خوندم مشخصه برنامه های زیادی برای سایت داشتید ولی اجرا نکردید
    چرا؟

    1. سلام دوست گرامی . ممنونم از شما. مدتی هست گرفتاری های شخصی و مشغله کاری مانع از خدمت رسانی بنده در این زمینه شده . از طرفی رفتار بعضی از دوستان و کامیونیتی هم کمی مایوس کننده و دلسرد کننده بود. بنده ترجیح دادم که بیشتر در راستای تقویت و ترقی خودم تلاش کنم. اما کماکان در خدمت دوستانی که سوال ومشکلی داشته باشن هستم و از ارایه ی تجربیاتم دریغ نمی کنم. همچنین آرزوی موفقیت همراه شادی برای شما دوست عزیز را دارم

      1. امان از دست این کامیونیتی ها منم با جامعه لینوکسی مشکلاتی را داشتم!!! جامعه ای که نباید اصلا به این شکل باشه و همه ازش انتظار دیگه ای دارن
        کاملا منطقیه که از وقتتون برای پیشرفت خودتون استفاده کنید.

        به نظرم این سایت هم می تونه باعث پیشرفت در حوزه کاری بشه و می تونه دریچه ای برای گرفتن پروژه های بیش تر و اعتبار بیش تر باشه مشابه کاری که در سایت ۱admin اتفاق افتاده

        به هرحال امیدوارم هرجایی هستید شاد و موفق باشید

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *