【问题标题】:Not properly inserting simple Varchar? Generating string [duplicate]没有正确插入简单的 Varchar?生成字符串[重复]
【发布时间】: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


【解决方案1】:

看起来我遇到这么多问题的原因是在使用 python 将单个变量插入 mysql 数据库时发生了一些不直观的格式。

当我写下声明时:

mycursor.execute("INSERT INTO Cases (systemSN) VALUES (%s)", (systemSN))

我收到了 1064 个不喜欢我的格式的错误。问题是需要在元组中传递的变量名。声明:

mycursor.execute("INSERT INTO Cases (systemSN) VALUES (%s)", (systemSN,))

工作正常。

我认为我很聪明地尝试一次将我的插入减少到一个变量,但实际上我只是发现了一个新问题!

感谢有关从控制台执行的提示。更有用的错误消息!感谢所有帮助。

【讨论】:

    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多