【发布时间】:2020-11-18 15:24:20
【问题描述】:
遇到一个奇怪的错误,我就是不知道出了什么问题。所以我有一个 MySQL 服务器,我正在使用这个脚本运行一个表设置:
CREATE TABLE Cases (
systemSN VARCHAR(15),
caseID int PRIMARY KEY AUTO_INCREMENT);
在 Python 3.8.6 中,我目前正在尝试在数据库的一个表中实现一个包含大约 19 个字段的大型表单,但我遇到了问题,所以我逐个字段缩小了范围,这是当前的基本 INSERT 我无法实现。
为了生成我要插入 MySQL 数据库的变量,我让用户选择行编辑或组合框来选择文本字符串,然后我尝试让他们将这些值上传到表中。
组合框显示字符串列表,例如:
systemSNs = ['----------------------', 'S129', '2342', 'a;sld']
for x in systemSNs:
self.ncw_SystemSN_CB.addItem(x)
我用来将组合框值传递给 MySQL 函数的函数是:
def submitNewCase_call(self):
print(self.ncw_SystemSN_CB.currentText())
print(type(self.ncw_SystemSN_CB.currentText()))
inputNewCaseintoDB(
self.ncw_SystemSN_CB.currentText()
)
然后我使用这个函数尝试将信息加载到数据库中:
def inputNewCaseintoDB(systemSN):
db = dbConnect() #connects to my database
mycursor = db.cursor()
addCase = ("INSERT INTO Cases "
"(systemSN) "
"VALUES (%s)")
mycursor.execute(addCase, systemSN)
print(systemSN)
db.commit()
db.close()
我在 pycharm 终端中得到的 Python 错误代码是: 进程以退出代码 -1073740791 (0xC0000409) 结束
如果我将变量 systemSN 替换为 int,我可以很好地插入,但由于某种原因,我似乎无法输入字符串,我不明白为什么不能。
编辑1:
例如:
testFormMain.py
from testForm import Ui_MainWindow
from PyQt5 import QtWidgets
import sys
import mysql.connector
def dbConnect():
db = mysql.connector.connect(
host="localhost",
user="root",
passwd="password!",
database="mysqldb"
)
return db
def inputNewCaseintoDB(systemSN):
print(systemSN)
db = dbConnect()
mycursor = db.cursor()
mycursor.execute("INSERT INTO Cases "
"(systemSN)"
"VALUES (%s)",
(systemSN))
db.commit()
db.close()
class testFormMain(QtWidgets.QMainWindow,
Ui_MainWindow):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setupUi(self)
self.ncw_Submit_PB.clicked.connect(self.submitNewCase_call)
systemSNs = ['----------------------', 'S129', '2342', 'a;sld']
for x in systemSNs:
self.ncw_SystemSN_CB.addItem(x)
def submitNewCase_call(self):
inputNewCaseintoDB(self.ncw_SystemSN_CB.currentText())
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
widget = testFormMain()
widget.show()
app.exec_()
testForm.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'testForm.ui'
#
# Created by: PyQt5 UI code generator 5.15.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(393, 307)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.ncw_Submit_PB = QtWidgets.QPushButton(self.centralwidget)
self.ncw_Submit_PB.setGeometry(QtCore.QRect(150, 210, 75, 23))
self.ncw_Submit_PB.setObjectName("ncw_Submit_PB")
self.ncw_SystemSN_CB = QtWidgets.QComboBox(self.centralwidget)
self.ncw_SystemSN_CB.setGeometry(QtCore.QRect(90, 70, 231, 81))
self.ncw_SystemSN_CB.setObjectName("ncw_SystemSN_CB")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 393, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.ncw_Submit_PB.setText(_translate("MainWindow", "Submit"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
编辑2: 我的代码中其他地方的一个函数示例,它试图为 James 执行类似的任务(将行编辑字段放入数据库表中)。无论我尝试用什么字符填充 VARCHAR,这个都没有问题按预期工作。
def addCompany(companyName, businessPhone, faxPhone, streetAddress, city, state, zipCode, country):
print(companyName, businessPhone, faxPhone, streetAddress, city, state, zipCode, country)
db = dbConnect()
mycursor = db.cursor()
mycursor.execute("INSERT INTO Company "
"(companyName,"
"businessPhone,"
"faxPhone,"
"streetAddress,"
"city,"
"state,"
"zipCode,"
"country)"
"VALUES (%s, %s, %s, %s, %s, %s, %s, %s)",
(companyName, businessPhone, faxPhone, streetAddress, city, state, zipCode, country))
db.commit()
db.close()
【问题讨论】:
-
1) 请提供 minimal reproducible example 和 2) 我建议从控制台或 CMD 运行您的脚本,以获得比数字代码更多信息的错误消息。
-
添加了分解为 UI 部分和主要代码部分的工作代码。原谅我,但我是一个新程序员,我不明白如何有效地编写这样的脚本。
-
你必须打开终端或CMD并运行:
python /pàth/of/your/script -
@Gus 你正在使用
mysql.connector,你的代码中的import mysql在哪里? -
@James 我不知道。我在代码的其他部分有效地使用了该语法。当我尝试在 %s 之前转义引号时,我的 Pycharm 开始抛出错误。
标签: python mysql pyqt5 varchar qcombobox