如何将数据从 ui(使用 pyqt 制作)添加到 sqlite 数据库?
how to add data from ui (made using pyqt) to sqlite db?
我用 QLineEdit 和 QPushButton 制作了一个简单的 pyqt gui。我喜欢将 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)感到困惑。
您可以使用 QtSql.QSqlQuery()
class 创建与数据库交互的查询对象。要执行查询(在本例中为 INSERT
查询),请执行以下步骤:
- 实例化一个
QSqlQuery()
对象。
- 对该对象调用
prepare()
方法,将要执行的 SQL 文本传递给 prepare()
方法。
- 使用
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()
请注意 我没有指定要插入的 table 名称,因为您提供了字段名称(id 和 url)而不是 table姓名;因此查询字符串使用了伪造的 table 名称 (table
)。您应该将其替换为真实的 table 名称。如果您的数据库中没有 table,则需要创建一个。请参考https://www.sqlite.org/lang.html for documentation on SQLite commands (e.g. for creating tables). Please also refer to the PyQt4 documentation on QtSql.QSqlQuery()
: http://pyqt.sourceforge.net/Docs/PyQt4/qsqlquery.html
对于 QSqlTableModel
和 QDataWidgetMapper
,如果没有特定的问题来回答它们,很难提供帮助,但我强烈建议您查看这两个很好的指南 classes: http://doc.qt.digia.com/qq/qq21-datawidgetmapper.html。本指南不使用 PyQt4(而是单独使用 Qt,因此代码使用 C++),但代码稀疏,即使您不熟悉 C++,概念也应该引起共鸣。
我用 QLineEdit 和 QPushButton 制作了一个简单的 pyqt gui。我喜欢将 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)感到困惑。
您可以使用 QtSql.QSqlQuery()
class 创建与数据库交互的查询对象。要执行查询(在本例中为 INSERT
查询),请执行以下步骤:
- 实例化一个
QSqlQuery()
对象。 - 对该对象调用
prepare()
方法,将要执行的 SQL 文本传递给prepare()
方法。 - 使用
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()
请注意 我没有指定要插入的 table 名称,因为您提供了字段名称(id 和 url)而不是 table姓名;因此查询字符串使用了伪造的 table 名称 (table
)。您应该将其替换为真实的 table 名称。如果您的数据库中没有 table,则需要创建一个。请参考https://www.sqlite.org/lang.html for documentation on SQLite commands (e.g. for creating tables). Please also refer to the PyQt4 documentation on QtSql.QSqlQuery()
: http://pyqt.sourceforge.net/Docs/PyQt4/qsqlquery.html
对于 QSqlTableModel
和 QDataWidgetMapper
,如果没有特定的问题来回答它们,很难提供帮助,但我强烈建议您查看这两个很好的指南 classes: http://doc.qt.digia.com/qq/qq21-datawidgetmapper.html。本指南不使用 PyQt4(而是单独使用 Qt,因此代码使用 C++),但代码稀疏,即使您不熟悉 C++,概念也应该引起共鸣。