如何将数据从ui(使用pyqt制作)添加到sqlite db?

时间:2015-01-24 10:40:24

标签: sqlite pyqt qtsql

我用QLineEdit和QPushButton创建了一个简单的pyqt gui。我想将 showurl (在下面给出的con.py中)添加到sqlite db。代码:
ui.py

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打印在终端上。我想将showurl添加到sqlitedb webscrap.db ,其中包含字段 id url

我也对使用模型视图(QSqlTableModel,QDataWidgetMapper)感到困惑。

1 个答案:

答案 0 :(得分:2)

您可以使用QtSql.QSqlQuery()类创建与数据库交互的查询对象。要执行查询(在本例中为INSERT查询),请执行以下步骤:

  1. 实例化QSqlQuery()对象。
  2. 调用该对象上的prepare()方法,将prepare()方法传递给您要执行的SQL文本。
  3. 使用addBindValue()方法将变量传入您的查询 - 在这种情况下,您希望传入showurl
  4. 最后,在查询对象上调用exec_()来执行 查询。如果有错误,您可以通过调用来检索它 查询对象lastError().text()
  5. 因此,在代码中,您需要将onClick()函数更改为:

    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和url),但没有提供表名;因此查询字符串使用伪表名(table)。您应该用真实的表名替换它。如果数据库中没有表,则需要创建一个表。有关SQLite命令的文档(例如,用于创建表),请参阅https://www.sqlite.org/lang.html。另请参阅QtSql.QSqlQuery()http://pyqt.sourceforge.net/Docs/PyQt4/qsqlquery.html

    上的PyQt4文档

    对于QSqlTableModelQDataWidgetMapper,如果没有具体问题可以回答这些问题很难提供帮助,但我强烈建议您查看这两个类的优秀指南:{{ 3}}。本指南不使用PyQt4(而是单独使用Qt,因此代码使用C ++),但代码很稀疏,即使您不熟悉C ++,这些概念也应该产生共鸣。