Как добавить данные из пользовательского интерфейса (сделанные с помощью PyQT) в SQL DB?

Я сделал простой PyQT GUI с QLineEdit и QPushButton. Я хотел бы добавить showurl(в con.py, указанном ниже) в БД sqlite. код:
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 ответ

Решение

Вы можете использовать QtSql.QSqlQuery() класс для создания объектов запроса, которые взаимодействуют с вашей базой данных. Чтобы выполнить запрос (в этом случае INSERT запрос), выполните следующие действия:

  1. Создать QSqlQuery() объект.
  2. Позвоните prepare() метод на этом объекте, передавая prepare() метод SQL-текст, который вы хотите выполнить.
  3. Использовать addBindValue() метод передачи переменных в ваш запрос - в этом случае вы хотите передать showurl,
  4. Наконец, позвоните exec_() на объект запроса, чтобы выполнить запрос. Если есть ошибка, вы можете получить ее, вызвав объект запроса lastError().text(),

Итак, в коде вам нужно будет изменить 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). Вы должны заменить это реальным именем таблицы. Если у вас нет таблицы в вашей базе данных, вам нужно ее создать. Пожалуйста, обратитесь к https://www.sqlite.org/lang.html для документации по командам SQLite (например, для создания таблиц). Пожалуйста, также обратитесь к документации PyQt4 на QtSql.QSqlQuery(): http://pyqt.sourceforge.net/Docs/PyQt4/qsqlquery.html

За QSqlTableModel а также QDataWidgetMapperТрудно помочь, не имея конкретного вопроса, чтобы ответить о них, но я настоятельно рекомендую вам ознакомиться с этим прекрасным руководством по обоим классам: http://doc.qt.digia.com/qq/qq21-datawidgetmapper.html В этом руководстве не используется PyQt4 (вместо этого он использует только Qt, поэтому код написан на C++), но код немногочислен, и концепции должны резонировать, даже если вы не знакомы с C++.

Другие вопросы по тегам