2015-01-24 13 views
0

QLineEdit 및 QPushButton으로 간단한 pyqt gui를 만들었습니다. 나는 showurl (아래의 con.py에 있음)을 sqlite db에 추가하고 싶다. 코드 :
ui.pyui (pyqt를 사용하여 만든 데이터)를 sqlite db에 추가하는 방법은 무엇입니까?

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_Form(object): 
    def setupUi(self, Form): 
     Form.setObjectName(_fromUtf8("Form")) 
     Form.resize(400, 300) 
     self.verticalLayout_2 = QtGui.QVBoxLayout(Form) 
     self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) 
     self.verticalLayout = QtGui.QVBoxLayout() 
     self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) 
     self.inserturl = QtGui.QLineEdit(Form) 
     self.inserturl.setObjectName(_fromUtf8("inserturl")) 
     self.verticalLayout.addWidget(self.inserturl) 
     spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) 
     self.verticalLayout.addItem(spacerItem) 
     self.insertdb_btn = QtGui.QPushButton(Form) 
     self.insertdb_btn.setObjectName(_fromUtf8("insertdb_btn")) 
     self.verticalLayout.addWidget(self.insertdb_btn) 
     self.verticalLayout_2.addLayout(self.verticalLayout) 

     self.retranslateUi(Form) 
     QtCore.QMetaObject.connectSlotsByName(Form) 

    def retranslateUi(self, Form): 
     Form.setWindowTitle(_translate("Form", "Form", None)) 
     self.insertdb_btn.setText(_translate("Form", "ok", None)) 

con.py

import sys 
from PyQt4 import QtCore, QtGui, QtSql 
from insertdb2_ui import Ui_Form 

def createConnection(): 
    db = QtSql.QSqlDatabase.addDatabase('QSQLITE') 
    db.setDatabaseName('webscrap.db') 
    if db.open(): 
     return True 
    else: 
     print db.lastError().text() 
     return False 

class Test(QtGui.QWidget, Ui_Form): 
    def __init__(self): 
     super(Test, self).__init__() 
     self.setupUi(self) 
     self.insertdb_btn.clicked.connect(self.onClick) 


    def onClick(self): 
     showurl = self.inserturl.text() 

     print showurl 
if __name__ == "__main__": 

    app = QtGui.QApplication(sys.argv) 
    if not createConnection(): 
     sys.exit(1) 
    window = Test() 
    window.show() 
    sys.exit(app.exec_()) 

난 데이터, 즉 입력했다. 터미널에 showurl 인쇄. 내가 webscrap.db 필드 IDURL있다에게 sqlitedb하는 showurl를 추가 할.

또한 모델 뷰 (QSqlTableModel, QDataWidgetMapper)를 사용하는 것에 대해 혼란 스럽습니다.

+0

질문에 대한 중요한 부분 만 남을 때까지 예제를 더 줄일 수 있다고 확신합니다. 그것은 질문을 다른 사람들에게 더 유용하게 만들 것입니다. – Trilarion

답변

1

QtSql.QSqlQuery() 클래스를 사용하여 데이터베이스와 상호 작용하는 쿼리 개체를 만들 수 있습니다. (이 경우에 INSERT 쿼리) 쿼리를 실행하기 위해, 다음 단계를 수행

  1. QSqlQuery()는 객체를 인스턴스화.
  2. 해당 개체에 prepare() 메서드를 호출하고 prepare() 메서드에 전달할 SQL 텍스트를 전달합니다.
  3. addBindValue() 메서드를 사용하여 쿼리에 변수를 전달하십시오.이 경우 showurl을 전달하고 싶습니다.
  4. 마지막으로 쿼리 개체에서 exec_()을 호출하여 쿼리를 실행합니다. 오류가있는 경우 쿼리 객체 lastError().text()을 호출하여 오류를 검색 할 수 있습니다.

    def onClick(self): 
        showurl = self.inserturl.text() 
        query_object = QtSql.QSqlQuery() 
        query_object.prepare("INSERT INTO table (url) VALUES (?)") 
        query_object.addBindValue(showurl) 
        if not query_object.exec_(): 
         print query_object.lastError().text() 
    

    난 당신이 필드 이름을 제공하기 때문에 삽입 할 테이블 이름을 지정하지 않은을 유의하시기 바랍니다 (ID :

그래서, 코드, 당신은 당신의 onClick() 기능을 변경해야합니다 및 url)하지만 테이블 이름은 아닙니다. 따라서 쿼리 문자열은 가짜 테이블 이름 (table)을 사용합니다. 이것을 실제 테이블 이름으로 바꾸어야합니다. 데이터베이스에 테이블이 없으면 테이블을 작성해야합니다. SQLite 명령 (예 : 테이블 만들기)에 대한 설명서는 https://www.sqlite.org/lang.html을 참조하십시오. http://pyqt.sourceforge.net/Docs/PyQt4/qsqlquery.htmlQSqlTableModelQDataWidgetMapper를 들어

, 그들에 대해 대답 할 수있는 구체적인 질문을하지 않고 도움이 어렵지만, 내가보기 엔 당신이 그 모두이 훌륭한 가이드를 확인하는 것이 좋습니다 또한 QtSql.QSqlQuery()에 PyQt4 설명서를 참조하십시오 수업 : http://doc.qt.digia.com/qq/qq21-datawidgetmapper.html. 이 가이드는 PyQt4를 사용하지 않습니다 (대신 Qt 만 사용하므로 코드는 C++입니다). 그러나 코드가 희박하며 C++에 익숙하지 않은 경우에도 개념이 공명해야합니다.

+0

감사합니다. 그것은 나를 위해 매우 도움이되었습니다. – amg