آموزش مدیریت پایگاه داده در PyQt
آموزش مدیریت پایگاه داده در PyQt
در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، به آموزش مدیریت پایگاه داده در PyQt خواهیم پرداخت.
پیشنهاد ویژه : پکیج آموزش پایتون مختص بازار کار
PyQt API شامل یک سیستم کلاس پیچیده برای ارتباط با بسیاری از پایگاه های داده مبتنی بر SQL است. QSqlDatabase آن دسترسی از طریق یک شیء Connection را فراهم می کند. در زیر لیستی از درایورهای SQL موجود موجود است –
نوع درایور و توضیحات | |
---|---|
1 | QDB2
IBM DB2 |
2 | QIBASE
Borland InterBase Driver |
3 | QMYSQL
MySQL Driver |
4 | QOCI
Oracle Call Interface Driver |
5 | QODBC
ODBC Driver (شامل Microsoft SQL Server) |
6 | QPSQL
PostgreSQL Driver |
7 | QSQLITE
SQLite version 3 or above |
8 | QSQLITE2
SQLite version 2 |
مثال
اتصال با پایگاه داده SQLite با استفاده از روش استاتیک ایجاد می شود –
1 2 |
db = QtSql.QSqlDatabase.addDatabase('QSQLITE') db.setDatabaseName('sports.db') |
روشهای دیگر کلاس QSqlDatabase به شرح زیر است –
روش ها و توضیحات | |
---|---|
1 | ()setDatabaseName
نام پایگاه داده ای را که اتصال با آن جستجو می شود تعیین می کند |
2 | ()setHostName
نام میزبانی را که پایگاه داده روی آن نصب شده است تعیین می کند |
3 | ()setUserName
نام کاربری را برای اتصال مشخص می کند |
4 | ()setPassword
در صورت وجود، رمز عبور شیء اتصال را تعیین می کند |
5 | ()commit
معاملات را انجام می دهد و در صورت موفقیت true برمی گرداند |
6 | ()rollback
تراکنش پایگاه داده را عقب می گرداند |
7 | ()close
اتصال را می بندد |
کلاس QSqlQuery قابلیت اجرا و دستکاری دستورات SQL را دارد. هر دو نوع DDL و DML کوئری SQL را می توان اجرا کرد. مهمترین متد در کلاس ()_exec است که یک رشته حاوی دستور SQL را برای اجرا به عنوان آرگومان می گیرد.
1 2 3 |
query = QtSql.QSqlQuery() query.exec_("create table sportsmen(id int primary key, " "firstname varchar(20), lastname varchar(20))") |
اسکریپت زیر پایگاه داده SQLite sports.db را با جدولی از افراد دارای پنج رکورد ایجاد می کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
from PyQt4 import QtSql, QtGui def createDB(): db = QtSql.QSqlDatabase.addDatabase('QSQLITE') db.setDatabaseName('sports.db') if not db.open(): QtGui.QMessageBox.critical(None, QtGui.qApp.tr("Cannot open database"), QtGui.qApp.tr("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() query.exec_("create table sportsmen(id int primary key, " "firstname varchar(20), lastname varchar(20))") query.exec_("insert into sportsmen values(101, 'Roger', 'Federer')") query.exec_("insert into sportsmen values(102, 'Christiano', 'Ronaldo')") query.exec_("insert into sportsmen values(103, 'Ussain', 'Bolt')") query.exec_("insert into sportsmen values(104, 'Sachin', 'Tendulkar')") query.exec_("insert into sportsmen values(105, 'Saina', 'Nehwal')") return True if __name__ == '__main__': import sys app = QtGui.QApplication(sys.argv) createDB() |
کلاس QSqlTableModel در PyQt یک رابط سطح بالا است که مدل داده قابل ویرایش را برای خواندن و نوشتن سوابق در یک جدول واحد فراهم می کند. این مدل برای پر کردن یک شی QTableView استفاده می شود. این یک نمای قابل پیمایش و قابل ویرایش را که می تواند در هر پنجره سطح بالا قرار گیرد به کاربر ارائه می دهد.
یک شی QTableModel به روش زیر اعلام می شود –
1 |
model = QtSql.QSqlTableModel() |
استراتژی ویرایش آن را می توان بر روی هر یک از موارد زیر تنظیم کرد –
QSqlTableModel.OnFieldChange همه تغییرات بلافاصله اعمال می شوند
QSqlTableModel.OnRowChange تغییرات زمانی اعمال می شود که کاربر ردیف دیگری را انتخاب کند
QSqlTableModel.OnManualSubmit همه تغییرات ذخیره می شوند تا زمانی که یا ()submitAll یا ()revertAll فراخوانی شود
مثال
در مثال زیر جدول sportsperson به عنوان یک مدل استفاده می شود و استراتژی به صورت زیر تنظیم شده است:
1 2 3 4 |
model.setTable('sportsmen') model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange) model.select() |
کلاس QTableView بخشی از چارچوب Model/View در PyQt است. شی QTableView به صورت زیر ایجاد می شود –
1 2 3 4 |
view = QtGui.QTableView() view.setModel(model) view.setWindowTitle(title) return view |
این شی QTableView و دو ویجت QPushButton به پنجره QDialog سطح بالا اضافه می شوند. سیگنال ()Clicked افزودن دکمه به ()addrow متصل می شود که ()insertRow را روی جدول مدل انجام می دهد.
1 2 3 4 5 |
button.clicked.connect(addrow) def addrow(): print model.rowCount() ret = model.insertRows(model.rowCount(), 1) print ret |
شکاف مربوط به دکمه حذف یک عملکرد lambda را اجرا می کند که یک سطر را حذف می کند ، که توسط کاربر انتخاب می شود.
1 |
btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row())) |
کد کامل به شرح زیر است –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
import sys from PyQt4 import QtCore, QtGui, QtSql import sportsconnection def initializeModel(model): model.setTable('sportsmen') model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange) model.select() model.setHeaderData(0, QtCore.Qt.Horizontal, "ID") model.setHeaderData(1, QtCore.Qt.Horizontal, "First name") model.setHeaderData(2, QtCore.Qt.Horizontal, "Last name") def createView(title, model): view = QtGui.QTableView() view.setModel(model) view.setWindowTitle(title) return view def addrow(): print model.rowCount() ret = model.insertRows(model.rowCount(), 1) print ret def findrow(i): delrow = i.row() if __name__ == '__main__': app = QtGui.QApplication(sys.argv) db = QtSql.QSqlDatabase.addDatabase('QSQLITE') db.setDatabaseName('sports.db') model = QtSql.QSqlTableModel() delrow = -1 initializeModel(model) view1 = createView("Table Model (View 1)", model) view1.clicked.connect(findrow) dlg = QtGui.QDialog() layout = QtGui.QVBoxLayout() layout.addWidget(view1) button = QtGui.QPushButton("Add a row") button.clicked.connect(addrow) layout.addWidget(button) btn1 = QtGui.QPushButton("del a row") btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row())) layout.addWidget(btn1) dlg.setLayout(layout) dlg.setWindowTitle("Database Demo") dlg.show() sys.exit(app.exec_()) |
خروجی به شکل زیر است:
لیست جلسات قبل آموزش PyQt
- آموزش PyQt
- آموزش مقدمه PyQt
- آموزش Hello World در PyQt
- آموزش کلاس های اصلی در PyQt
- آموزش استفاده از Qt Designer در PyQt
- آموزش سیگنال ها و شکاف ها در PyQt
- آموزش مدیریت طرح بندی در PyQt
- آموزش ویجت های کلی در PyQt
- آموزش کلاس QDialog در PyQt
- آموزش کلاس QMessageBox در PyQt
- آموزش رابط چندین سند در PyQt
- آموزش کشیدن و رها کردن در PyQt
دیدگاه شما