Как добавить данные из пользовательского интерфейса (сделанные с помощью 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
запрос), выполните следующие действия:
- Создать
QSqlQuery()
объект. - Позвоните
prepare()
метод на этом объекте, передаваяprepare()
метод SQL-текст, который вы хотите выполнить. - Использовать
addBindValue()
метод передачи переменных в ваш запрос - в этом случае вы хотите передатьshowurl
, - Наконец, позвоните
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++.