PyQt-데이터베이스 처리

PyQt API에는 많은 SQL 기반 데이터베이스와 통신하기위한 정교한 클래스 시스템이 포함되어 있습니다. QSqlDatabase는 연결 개체를 통해 액세스를 제공합니다. 다음은 현재 사용 가능한 SQL 드라이버 목록입니다.

Sr. 아니. 드라이버 유형 및 설명
1

QDB2

IBM DB2

2

QIBASE

Borland InterBase 드라이버

QMYSQL

MySQL 드라이버

4

QOCI

Oracle Call Interface 드라이버

5

QODBC

ODBC 드라이버 (Microsoft SQL Server 포함)

6

QPSQL

PostgreSQL 드라이버

7

QSQLITE

SQLite 버전 3 이상

8

QSQLITE2

SQLite 버전 2

SQLite 데이터베이스와의 연결은 정적 방법을 사용하여 설정됩니다.

db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
db.setDatabaseName('sports.db')

QSqlDatabase 클래스의 다른 방법은 다음과 같습니다-

Sr. 아니. 방법 및 설명
1

setDatabaseName()

연결이 필요한 데이터베이스의 이름을 설정합니다.

2

setHostName()

데이터베이스가 설치된 호스트의 이름을 설정합니다.

setUserName()

연결을위한 사용자 이름을 지정합니다.

4

setPassword()

연결 개체의 암호를 설정합니다.

5

commit()

트랜잭션을 커밋하고 성공하면 true를 반환합니다.

6

rollback()

데이터베이스 트랜잭션을 롤백합니다.

7

close()

연결을 닫습니다.

QSqlQuery 클래스에는 SQL 명령을 실행하고 조작하는 기능이 있습니다. DDL 및 DML 유형의 SQL 쿼리를 모두 실행할 수 있습니다. 클래스에서 가장 중요한 메서드는 실행할 SQL 문을 포함하는 문자열을 인수로 취하는 exec_ ()입니다.

query = QtSql.QSqlQuery()
query.exec_("create table sportsmen(id int primary key, 
   " "firstname varchar(20), lastname varchar(20))")

다음 스크립트는 5 개의 레코드로 채워진 sportsperson 테이블이있는 SQLite 데이터베이스 sports.db를 생성합니다.

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

PyQt의 QSqlTableModel 클래스는 단일 테이블에서 레코드를 읽고 쓰기위한 편집 가능한 데이터 모델을 제공하는 고급 인터페이스입니다. 이 모델은 QTableView 개체를 채우는 데 사용됩니다. 사용자에게 스크롤 및 편집 가능한보기를 제공하여 모든 최상위 창에 표시 할 수 있습니다.

QTableModel 객체는 다음과 같은 방식으로 선언됩니다-

model = QtSql.QSqlTableModel()

편집 전략은 다음 중 하나로 설정할 수 있습니다.

QSqlTableModel.OnFieldChange 모든 변경 사항이 즉시 적용됩니다.
QSqlTableModel.OnRowChange 사용자가 다른 행을 선택하면 변경 사항이 적용됩니다.
QSqlTableModel.OnManualSubmit 모든 변경 사항은 submitAll () 또는 revertAll ()이 호출 될 때까지 캐시됩니다.

다음 예에서 sportsperson 테이블은 모델로 사용되며 전략은 다음과 같이 설정됩니다.

model.setTable('sportsmen') 
model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)

   model.select()

QTableView 클래스는 PyQt의 Model / View 프레임 워크의 일부입니다. QTableView 객체는 다음과 같이 생성됩니다-

view = QtGui.QTableView()
view.setModel(model)
view.setWindowTitle(title)
return view

이 QTableView 개체와 두 개의 QPushButton 위젯이 최상위 QDialog 창에 추가됩니다. add 버튼의 Clicked () 신호는 모델 테이블에서 insertRow ()를 수행하는 addrow ()에 연결됩니다.

button.clicked.connect(addrow)
def addrow():
   print model.rowCount()
   ret = model.insertRows(model.rowCount(), 1)
   print ret

삭제 버튼과 연결된 슬롯은 사용자가 선택한 행을 삭제하는 람다 함수를 실행합니다.

btn1.clicked.connect(lambda: model.removeRow(view1.currentIndex().row()))

완전한 코드는 다음과 같습니다.

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_())

위의 코드는 다음 출력을 생성합니다.